ubuntuusers.de

Bash Textbased RPG

Status: Ungelöst | Ubuntu-Version: Server 11.10 (Oneiric Ocelot)
Antworten |

sc0p

Avatar von sc0p

Anmeldungsdatum:
10. Januar 2012

Beiträge: 34

Wohnort: Schweiz

Hallo zusammen

Ich habe ein einfaches textbasiertes Rollenspiel in bash geschrieben.

Die Leute aus den ubuntuusers forum /Spiele haben mich gekonnt ignoriert... ☹

Gebt ihr mir ein paar Anregungen, Tipps, usw. was oder ggf. wie ich das noch erweitern/verbessern soll?

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
#!/bin/bash
#
# Copyright: 	Kissling Iwan	
# Note:		A simple RPG
#
#################################
clear					

set.player()
{
splvl=1 
maxsphp=100
sphp=100			
maxspmp=100
spmp=100
spint=0
spdmg=0
spexp=0
t=1 # Trank
echo -n "Wie lautet dein Name? > "
read Name						
clear
}
set.player # LOAD that function

set.monster()
{
monlist="Mutant Zombie Fuchs Wolf Schwertmeister Jaeger Fisch Riesenspinne Zentaur Roboter"
monhplist="350 300 150 250 350 300 10 250 300 250"
mondmglist="10 5 3 5 7 4 0 3 3 4"
monhitlist="8 8 7 8 10 7 0 7 8 10"
monexplist="200 150 70 100 150 100 1000 60 100 150"
monlist_chooser=`echo $(($RANDOM % 10+1))` 
mon=`echo $monlist | awk '{print $'$monlist_chooser'}'`
monhp=`echo $monhplist | awk '{print $'$monlist_chooser'}'`
mondmg=`echo $mondmglist | awk '{print $'$monlist_chooser'}'`
monhit=`echo $monhitlist | awk '{print $'$monlist_chooser'}'`
monexp=`echo $monexplist | awk '{print $'$monlist_chooser'}'`
}
set.monster # LOAD that function

set.loot()
{
lootlist="Trank HP-Kette Trank MP-Kette Trank Fischskelett Trank Knochen UltraFingerRing Trank"
lootact="1 2 1 3 1 4 1 5 6 1"
loot_chooser=`echo $(($RANDOM % 10+1))`
lootname=`echo $lootlist | awk '{print $'$loot_chooser'}'`
loot=`echo $lootact | awk '{print $'$loot_chooser'}'`

case $loot in

1)
 echo "Ein Trank wurde deinem Inventar hinzugefuegt"
 echo
 let t=$t+1
;;

2)
 echo "Eine HP Kette wurde gefunden"
 echo "Stat: +30HP (dauerhaft)"
 echo
 let sphp=$sphp+30
;;

3)
 echo "Eine MP Kette wurde gefunden"
 echo "Stat: +30MP (dauerhaft)"
 echo
 let spmp=$spmp+30
;;

4)
 echo "Toll: $lootname"
 echo "Es ist zu nichts zu gebrauchen..."
 echo
;;

5)
 echo "Toll: $lootname"
 echo "Es ist zu nichts zu gebrauchen..."
 echo
;;

6)
 echo "Eine maechtiger UltraFingerRing(!) wurde gefunden"
 echo "Stat: +25 DMG! (dauerhaft)"
 echo
 let spdmg=$spdmg+25
;;

esac
}

fight()						
{					
trap raus SIGINT		
noatk=0
clear
echo "Welche Atacke benutzen?"
echo
echo ".-^-._.-^-._.-^-._.-^-._.-^-._.-^-."
echo "|                                 |"		   
echo "| 1. Blitz (DMG: 30-40) (MP: 20)  |" 
echo "| 2. Feuer (DMG: 50-60) (MP: 25)  |" 
echo "| 3. Faustschlag (DMG: 25)        |"
echo "| 4. Highkick (DMG: 40)           |"
echo "| 5. Heilen (HP + 40) (MP: 30)    |"	
echo "| 6. Manatrank (Vorrat: $t)        |"	
echo "|                                 |"	   	   
echo "L=================================J" 	
######## STATSDISPLAY
	echo		
	echo "Monster: $mon"		
	echo "DMG: $mondmg"	
	echo "HP: ($monhp/`echo $monhplist | awk '{print $'$monlist_chooser'}'`)"  
	echo 			
	echo 
	echo "Spieler: $Name"		
	echo "LvL: $splvl"
	echo "DMG: + $spdmg"
	echo "INT: + $spint"
	echo "HP: ($sphp/$maxsphp) " 
	echo "MP: ($spmp/$maxspmp) " 
	echo "EXP: $spexp"
	echo
######## Ende STATSDISPLAY
echo -n "-> "
read atk
hit=`echo $(($RANDOM % 10+1))` 		
shit=`echo $(($RANDOM % 10+1))`	
crit=`echo $(($RANDOM % 10+1))`

clear
case $atk in

 1)
	if [ $spmp -lt 20 ]
	then
		echo "Zu wenig MP"
		echo -n "..." ; unset atk
		noatk=1 
	else
	echo "++++++++++++++++++++++++++++++++++"
	echo "Ein Blitz schnellt auf den Gegner"
	echo "++++++++++++++++++++++++++++++++++"
	sleep 1
	failchance="3" 			
	critchance="9"		
	let spmp=$spmp-20
	bdmg=30
	attack
	fi
 ;;

 2)
	if [ $spmp -lt 25 ]
	then
		echo "Zu wenig MP"
		echo -n "..." ; unset atk
		noatk=1
	else
	echo "+++++++++++++++++++++++++++++++++++++"
	echo "Ein Feuerball wirbelt auf den Gegner"
	echo "+++++++++++++++++++++++++++++++++++++"
	sleep 1
	failchance="5"
	critchance="10"
	let spmp=$spmp-25
	let bdmg=$bdmg+50+$spint
	attack
	fi
 ;;

 3)
	echo "+++++++++++++++++++++++++++++++++++++++++++"
	echo "ein kraftvoller Faustschlag auf den Gegner"
	echo "+++++++++++++++++++++++++++++++++++++++++++"
	sleep 1
	failchance="-1"
	critchance="8"
	let bdmg=$bdmg+25+$spdmg
	attack
 ;;

 4)
	echo "+++++++++++++++++++++++++++++++++++++++++++"
	echo "ein kraftvoller Fusskick auf den Gegner"
	echo "+++++++++++++++++++++++++++++++++++++++++++"
	sleep 1
	failchance="5"
	critchance="9"
	let bdmg=$bdmg+40+$spdmg
	attack
 ;;

 5)
	if [ $spmp -lt 30 ]
	then
		echo "Zu wenig MP"
		echo -n "..." ; unset atk
		noatk=1
	else
	echo "++++++++++++++++++++++++++"
	echo "$Name heilt sich um 40 HP"
	echo "++++++++++++++++++++++++++"
	echo
	let spmp=$spmp-30	
	let sphp=$sphp+40+$spint		
	sleep 1
	echo 
	echo
	fi
 ;;

 6)
	if [ $t -lt 1 ]
	then
		echo "Leider kein Trank mehr da..."
		echo -n "..." ; unset atk
		noatk=1
	else
	echo "++++++++++++++++++++++++"
	echo "$Name fuellt die MP auf"
	echo "++++++++++++++++++++++++"
	echo
	let t=$t-1
	spmp=$maxspmp
	fi
 ;;

 quit)
 	raus
 ;;

 cheat)
	echo "Wieviel loot und statpunkte?"
	read cheating
	i=0
	 while [ $i -lt $cheating ]
	 do
	unset atk ; stats ; set.loot ; let i=$i+1
	 done
	noatk=1 ; monatk
 ;;

 q)
	raus
 ;;

 *)
	echo "invalid choose"
	echo
	echo "Type a number from 1-6"
	echo "or Quit to exit"
	echo -n "..." ; read
	fight 				 
 ;;

esac
}

attack()				
{				
if [ $hit -ge $failchance ]             
then
    if [ $crit -ge $critchance ]       
    then
		let monhp=$monhp-2*$bdmg-$shit # Monster HP-2*Base DMG-Special Hit-DMG
		echo
		echo "Critical HIT"
		echo
    else
		let monhp=$monhp-$bdmg-$shit-$spdmg     
		echo			     
		echo "Normal HIT"	      
		echo			     
	fi
else
	echo
	echo "Verfehlt!" 	
	echo 
fi
}

monatk()
{
if [ $noatk -eq 1 ]
then
# Do nothing atm...
noatk=0
else
monhit=`echo $(($RANDOM % 10+1))`  
	echo 
	echo "++++++++++++++++++++"
	echo "$mon schlaegt zu"
	echo "++++++++++++++++++++"
	sleep 0.5
		if [ $hit -ge -2 ]
		then
		    if [ $crit -eq 9 ]
		    then
			let sphp=$sphp-2*10
			echo
			echo "Critical HIT"
			echo
		    else
			let sphp=$sphp-10
			echo
			echo "Normal HIT"
			echo
		    fi
		else
			echo 
			echo "$mon verfehlt"
			echo
		fi
fi
}

raus()				
{
clear

echo "Quit?"
echo -n "[y/n] "
read endeee
if [ $endeee == y ]
then
	exit
else
	echo "goin' back"
	sleep 0.5
fi
}

stats()
{
	spexp=0
	let splvl=$splvl+1
	echo "Grossartig, LvL Up!"
	echo "Neues Level: $splvl!"
	echo
	echo "Neuer Statuspunkt verfuegbar: "
	echo
	echo "1. + 10 HP"
	echo "->   10 Punkte zu deinen Lebensenergie"
	echo
	echo "2. + 10 MP"
	echo "->   10 Punkte zu deinen Magiepunkten"
	echo
	echo "3. + 1 DMG"
	echo "->   Schlaege und Kicks richten mehr"
	echo " 	   Schaden an"
	echo
	echo "4. + 1 INT"
	echo "->   Zaubersprueche richten mehr Schaden"
	echo "     an"
	echo
	read lvlupstat

	case $lvlupstat in
		1)
		echo
		let maxsphp=$maxsphp+10
		echo "10 Punkte zu HP hinzugefuegt"
		;;

		2)
		echo
		let maxspmp=$maxspmp+10
		echo "10 Punkte zu MP hinzugefuegt"
		;;

		3)
		echo
		let spdmg=$spdmg+1
		echo "1 Punkt zu DMG hinzugefuegt"
		;;

		4)
		echo
		let spint=$spint+1
		echo "1 Punkt zu INT hinzugefuegt"
		;;
	
		*)
		echo
		echo "Willst du etwa keine Verbesserung?"
		echo "..." ; read
		stats
		;;
	esac
}

winning()
{
echo "Gewonnen!"
echo
lootfound=`echo $(($RANDOM % 10+1))`  
if [ $lootfound -lt 8 ]
then
 echo "In dem Leichnam findest du:"
 set.loot
 echo
fi
echo
 let spexp=$spexp+$monexp
echo
echo "$monexp EXP hinzugefuegt!"
 if [ $spexp -ge 200 ]
 then
  stats # Go spend some stat-Points!
 fi
echo


sphp=$maxsphp	# Fill up HP & MP
spmp=$maxspmp

set.monster	# Monster resetten

sleep 2
echo
echo "Das naechste Monster greifft an!"
echo -n "ENTER wenn bereit" ; read
echo
}

# Beginning Monster fight

echo "Tief im Wald von Biogradska Gora tiffst du auf eine seltsame Gestalt.
Ploetzlich dreht sie sich um und greifft dich an.
Bereite dich auf den Kampf vor..."
echo 
echo "ENTER, wenn bereit"
read
sleep 1

while [ $sphp -ge 1 ] 		# Fight while SP + MON HP greater/equal 1
do			
  fight				# SP attacks	
  # Monster lives
  if [ $monhp -ge 1 ]  
  then
    monatk			# MON attacks	
    echo -n "..." ; read
  else
    winning			# Get reward for killing a monster
  fi
done


echo "Du stirbst..."
echo

Freu mich auf Vorschläge !

Gruss

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

sc0p schrieb:

Ich habe ein einfaches textbasiertes Rollenspiel in bash geschrieben.

Oha...

Gebt ihr mir ein paar Anregungen, Tipps, usw. was oder ggf. wie ich das noch erweitern/verbessern soll?

<snip/>

Das ist ein bisschen viel Code für die Einbettung im Post. Auf den ersten Blick fällt mir auf, dass Du die echo-Kaskaden durch Heredocs ersetzen könntest.

Freu mich auf Vorschläge !

Keine Leerzeichen vor Satzzeichen. 😉

Ciao

robert

sc0p

(Themenstarter)
Avatar von sc0p

Anmeldungsdatum:
10. Januar 2012

Beiträge: 34

Wohnort: Schweiz

rklm schrieb:

sc0p schrieb:

Ich habe ein einfaches textbasiertes Rollenspiel in bash geschrieben.

Oha...

ohja!

(bei den Forenregeln steht doch aber, dass man auch längere codes posten kann/darf da sie ja automatisch mit scrollbars und allem drum und dran automatisch verkleinert werden und die Foren-Kommunikation keinesfalls behindern)

Die echos hab ich nicht mit here docs ersetzt, da dieses script auf cygwin (emulierte bash umgebung auf Windows) laufen soll, damit meine nicht Unix Freunde es testen können. ^^

Ich meinte aber auch inhaltlich; Fühl dich wie 1980 und spiel das Spiel 😛

Gruss

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

sc0p schrieb:

rklm schrieb:

sc0p schrieb:

(bei den Forenregeln steht doch aber, dass man auch längere codes posten kann/darf da sie ja automatisch mit scrollbars und allem drum und dran automatisch verkleinert werden und die Foren-Kommunikation keinesfalls behindern)

Ja, die Regel ist eins - die Lesbarkeit vielleicht etwas anderes.

Die echos hab ich nicht mit here docs ersetzt, da dieses script auf cygwin (emulierte bash umgebung auf Windows) laufen soll, damit meine nicht Unix Freunde es testen können. ^^

Das ist keine gute Begründung: Heredocs in der bash unter Cygwin funktionieren genau so wie unter Linux und anderen Unixen.

Ich meinte aber auch inhaltlich; Fühl dich wie 1980 und spiel das Spiel 😛

Sorry, aber dafür habe ich gerade keine Zeit. ☺

Ciao

robert

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Hinzu kommt, dass man so lange Code nicht so einfach kopieren kann - damit wird es einem schwer gemacht, das ganze lokal selber auszuprobieren. Ich empfehle daher die Benutzung eines externen Pastebins, a la paste.pocoo.org.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Hast Du schon vom DRY-Prinzip gehört (Don't repeat yourself)?

1
2
3
4
5
6
7
8
9
	echo
	echo "Normal HIT"
	echo
    fi
else
	echo 
	echo "$mon verfehlt"
	echo
fi

Dies riecht etwas nach einer Funktion 'blankedMessage' o.s.ä., und eine 'framedMessage'

1
2
3
	echo "++++++++++++++++++++"
	echo "$mon schlaegt zu"
	echo "++++++++++++++++++++"

scheint auch zu fehlen - Umlaute mit UTF-8 gehen nicht mit cygwin?

Was die Zeilenzahl betrifft - 1000 Zeilen geht m.E. noch. Jedes Icon hat mehr als diese 8000 Bytes.

Zeit für's Spielen oder genauere Betrachten habe ich auch nicht.

Eine Lizenz fehlt noch, unter der das gespielt werden darf, verändert und weiterverbreitet. Ich schlage GPLv3 vor.

sc0p

(Themenstarter)
Avatar von sc0p

Anmeldungsdatum:
10. Januar 2012

Beiträge: 34

Wohnort: Schweiz

achso

http://paste.pocoo.org/show/544086/ (Original)

Oke, Danke schonmal

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Das Pastebin beherrscht Syntax Highlighting: Kopie 😉

Ich will mal ganz ehrlich sein: Imho zeigt sich bei so einem Projekt, was der Bash fehlt: Grundlegende Datenstrukturen! Bei so einem Projekt ist das auf Dauer einfach unmöglich, ohne sich in Komplexität von einzelnen, unabhängigen Namen zu verlieren. Ich finde es immer gut, wenn man ein für sich motivierendes Projekt angeht. Imho solltest Du jetzt darüber nachdenken, eine wirklich universelle Programmiersprache zu erlernen ☺

sc0p

(Themenstarter)
Avatar von sc0p

Anmeldungsdatum:
10. Januar 2012

Beiträge: 34

Wohnort: Schweiz

Lysander schrieb:

eine wirklich universelle Programmiersprache

Na dann, auf zu Python '^^

Da kann ich meine Bash-Grundlagen einbeziehen und immer wie mehr reduzieren

DRY hab ich doch schon massiv reduziert... vorgängige Versionen waren da noch schlimmer...

Blanked oder Framed Message functions hab ich nicht gefunden...

user unknown schrieb:

Umlaute mit UTF-8 gehen nicht mit cygwin?

Doch schon, allerdings nicht auf meinem Ubuntu Server; resp. will ich all diese hässlichen Zeichen nirgendwo drin haben # èéàáôöäü

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

sc0p schrieb:

Blanked oder Framed Message functions hab ich nicht gefunden...

Weil Du sie selbst schreiben müsstest.

user unknown schrieb:

Umlaute mit UTF-8 gehen nicht mit cygwin?

Doch schon, allerdings nicht auf meinem Ubuntu Server; resp. will ich all diese hässlichen Zeichen nirgendwo drin haben # èéàáôöäü

Was findest Du daran haesslich?

sc0p

(Themenstarter)
Avatar von sc0p

Anmeldungsdatum:
10. Januar 2012

Beiträge: 34

Wohnort: Schweiz

user unknown schrieb:

sc0p schrieb:

Doch schon, allerdings nicht auf meinem Ubuntu Server; resp. will ich all diese hässlichen Zeichen nirgendwo drin haben # èéàáôöäü

Was findest Du daran haesslich?

Umlaute gehören nicht in eine Shell

Ansonsten könnte ich alles noch schweizerdeutsch schreiben, mit ca 3 Mal so viel Umlauten wie im Schriftdeutschen.

"Das heiter äuä ned dänkt, das öper ufd idee würd cho ö ü oder ü ines skript ihfüege"

"Das wär so öpis vo säutsam, und wie gseit es gseht hässlech us!"

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

sc0p schrieb:

Umlaute gehören nicht in eine Shell

Unsinn!

sc0p

(Themenstarter)
Avatar von sc0p

Anmeldungsdatum:
10. Januar 2012

Beiträge: 34

Wohnort: Schweiz

Lysander schrieb:

sc0p schrieb:

Umlaute gehören nicht in eine Shell

Unsinn!

und wenn dann plötzlich dank meines internationalen Erfolges aus all den Umlauten auf den englischen terminals

1
2
3
$ echo 'öööö ääää  üüüü  éééé  àààà'

ö ääüééÃ

wird?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

sc0p schrieb:

und wenn dann plötzlich dank meines internationalen Erfolges aus all den Umlauten auf den englischen terminals

1
2
3
$ echo 'öööö ääää  üüüü  éééé  àààà'

ö ääüééÃ

wird?

Dann ist das blöde Terminal Win...- krank !
Da passiert sowas regelmäßig, weil sich die verschiedenen Win..- und ISO-Codepages dauernd ins Gehege kommen.

Bei UTF-8 kann sowas ausdrücklich nicht passieren, dafür ist es schließlich UTF-8 !

LG,

track

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

sc0p schrieb:

und wenn dann plötzlich dank meines internationalen Erfolges aus all den Umlauten auf den englischen terminals

1
2
3
$ echo 'öööö ääää  üüüü  éééé  àààà'

ö ääüééÃ

wird?

Ja und? Nur weil einige Shells ggf. nicht mit Unicode-Zeichen zurecht kommen und immer noch an ASCII + ein wenig mehr gebunden sind (Die unsägliche Windows COM etwa), heisst das doch noch nicht, dass man darauf verzichten will oder soll! Oder sollte man sich anstatt auf Unicode zu setzen, wieder auf ASCII einschießen und alles andere verbannen? Ich denke nicht nur alle User mit dem Namen "Müller" würden darüber zu recht erzürnt sein...

Antworten |