View difference between Paste ID: wiYhGde8 and jyBXJZVx
SHOW: | | - or go back to the newest paste.
1
--Modified for use with MCCI.
2
local print = function(text)
3
	WHISPER(_USERNAME,text)
4
end
5
6
local tBiomes = {
7
	"in a forest",
8
	"in a pine forest",
9
	"knee deep in a swamp",
10
	"in a mountain range",
11
	"in a desert",
12
	"in a grassy plain",
13
	"in frozen tundra",
14
}
15
16
local function hasTrees( _nBiome )
17
	return _nBiome <= 3
18
end
19
20
local function hasStone( _nBiome )
21
	return _nBiome == 4
22
end
23
24
local function hasRivers( _nBiome )
25
	return _nBiome ~= 3 and _nBiome ~= 5
26
end
27
28
local items = {
29
	["no tea"] = {
30
		droppable = false,
31
		desc = "Pull yourself together man.",
32
	},
33
	["a pig"] = {
34
		heavy = true,
35
		creature = true,
36
		drops = { "some pork" },
37
		aliases = { "pig" },
38
		desc = "The pig has a square nose.",
39
	},
40
	["a cow"] = {
41
		heavy = true,
42
		creature = true,
43
		aliases = { "cow" },
44
		desc = "The cow stares at you blankly.",
45
	},
46
	["a sheep"] = {
47
		heavy = true,
48
		creature = true,
49
		hitDrops = { "some wool" },
50
		aliases = { "sheep" },
51
		desc = "The sheep is fluffy.",
52
	},
53
	["a chicken"] = {
54-
		desc = "The chicken looks delicious.",
54+
55
		creature = true,
56
		drops = { "some chicken" },
57
		aliases = { "chicken" },
58
		desc = "Don't tell it, but the chicken looks delicious.",
59
	},
60
	["a creeper"] = {
61
		heavy = true,
62
		creature = true,
63
		monster = true,
64
		aliases = { "creeper" },
65
		desc = "The creeper needs a hug.",
66
	},
67
	["a skeleton"] = {
68
		heavy = true,
69
		creature = true,
70
		monster = true,
71
		aliases = { "skeleton" },
72
		nocturnal = true,
73
		desc = "The head bone's connected to the neck bone, the neck bone's connected to the chest bone, the chest bone's connected to the arm bone, the arm bone's connected to the bow, and the bow is pointed at you.",
74
	},
75
	["a zombie"] = {
76
		heavy = true,
77
		creature = true,
78
		monster = true,
79
		aliases = { "zombie" },
80
		nocturnal = true,
81
		desc = "All he wants to do is eat your brains.",
82
	},
83
	["a spider"] = {
84
		heavy = true,
85
		creature = true,
86
		monster = true,
87
		aliases = { "spider" },
88
		desc = "Dozens of eyes stare back at you.",
89
	},
90
	["a cave entrance"] = {
91
		heavy = true,
92
		aliases = { "cave entance", "cave", "entrance" },
93
		desc = "The entrance to the cave is dark, but it looks like you can climb down.",
94
	},
95
	["an exit to the surface"] = {
96
		heavy = true,
97
		aliases = { "exit to the surface", "exit", "opening" },
98
		desc = "You can just see the sky through the opening.",
99
	},
100
	["a river"] = {
101
		heavy = true,
102
		aliases = { "river" },
103
		desc = "The river flows majestically towards the horizon. It doesn't do anything else.",
104
	},
105
	["some wood"] = {
106
		aliases = { "wood" },
107
		material = true,
108
		desc = "You could easilly craft this wood into planks.",
109
	},
110
	["some planks"] = {
111
		aliases = { "planks", "wooden planks", "wood planks" },
112
		desc = "You could easilly craft these planks into sticks.",
113
	},
114
	["some sticks"] = {
115
		aliases = { "sticks", "wooden sticks", "wood sticks" },
116
		desc = "A perfect handle for torches or a pickaxe.",
117
	},
118
	["a crafting table"] = {
119
		aliases = { "crafting table", "craft table", "work bench", "workbench", "crafting bench", "table", },
120
		desc = "It's a crafting table. I shouldn't tell you this, but these don't actually do anything in this game, you can craft tools whenever you like.",
121
	},
122
	["a furnace"] = {
123
		aliases = { "furnace" },
124
		desc = "It's a furnace. Between you and me, these don't actually do anything in this game.",
125
	},
126
	["a wooden pickaxe"] = {
127
		aliases = { "pickaxe", "pick", "wooden pick", "wooden pickaxe", "wood pick", "wood pickaxe" },
128
		tool = true,
129
		toolLevel = 1,
130
		toolType = "pick",
131
		desc = "The pickaxe looks good for breaking stone and coal.",
132
	},
133
	["a stone pickaxe"] = {
134
		aliases = { "pickaxe", "pick", "stone pick", "stone pickaxe" },
135
		tool = true,
136
		toolLevel = 2,
137
		toolType = "pick",
138
		desc = "The pickaxe looks good for breaking iron.",
139
	},
140
	["an iron pickaxe"] = {
141
		aliases = { "pickaxe", "pick", "iron pick", "iron pickaxe" },
142
		tool = true,
143
		toolLevel = 3,
144
		toolType = "pick",
145
		desc = "The pickaxe looks strong enough to break diamond.",
146
	},
147
	["a diamond pickaxe"] = {
148
		aliases = { "pickaxe", "pick", "diamond pick", "diamond pickaxe" },
149
		tool = true,
150
		toolLevel = 4,
151
		toolType = "pick",
152
		desc = "Best. Pickaxe. Ever.",
153
	},
154
	["a wooden sword"] = {
155
		aliases = { "sword", "wooden sword", "wood sword" },
156
		tool = true,
157
		toolLevel = 1,
158
		toolType = "sword",
159
		desc = "Flimsy, but better than nothing.",
160
	},
161
	["a stone sword"] = {
162
		aliases = { "sword", "stone sword" },
163
		tool = true,
164
		toolLevel = 2,
165
		toolType = "sword",
166
		desc = "A pretty good sword.",
167
	},
168
	["an iron sword"] = {
169
		aliases = { "sword", "iron sword" },
170
		tool = true,
171
		toolLevel = 3,
172
		toolType = "sword",
173
		desc = "This sword can slay any enemy.",
174
	},
175
	["a diamond sword"] = {
176
		aliases = { "sword", "diamond sword" },
177
		tool = true,
178
		toolLevel = 4,
179
		toolType = "sword",
180
		desc = "Best. Sword. Ever.",
181
	},
182
	["a wooden shovel"] = {
183
		aliases = { "shovel", "wooden shovel", "wood shovel" },
184
		tool = true,
185
		toolLevel = 1,
186
		toolType = "shovel",
187
		desc = "Good for digging holes.",
188
	},
189
	["a stone shovel"] = {
190
		aliases = { "shovel", "stone shovel" },
191
		tool = true,
192
		toolLevel = 2,
193
		toolType = "shovel",
194
		desc = "Good for digging holes.",
195
	},
196
	["an iron shovel"] = {
197
		aliases = { "shovel", "iron shovel" },
198
		tool = true,
199
		toolLevel = 3,
200
		toolType = "shovel",
201
		desc = "Good for digging holes.",
202
	},
203
	["a diamond shovel"] = {
204
		aliases = { "shovel", "diamond shovel" },
205
		tool = true,
206
		toolLevel = 4,
207
		toolType = "shovel",
208
		desc = "Good for digging holes.",
209
	},
210
	["some coal"] = {
211
		aliases = { "coal" },
212
		ore = true,
213
		toolLevel = 1,
214
		toolType = "pick",
215
		desc = "That coal looks useful for building torches, if only you had a pickaxe to mine it.",
216
	},
217
	["some dirt"] = {
218
		aliases = { "dirt" },
219
		material = true,
220
		desc = "Why not build a mud hut?",
221
	},
222
	["some stone"] = {
223
		aliases = { "stone", "cobblestone" },
224
		material = true,
225
		ore = true,
226
		infinite = true,
227
		toolLevel = 1,
228
		toolType = "pick",
229
		desc = "Stone is useful for building things, and making stone pickaxes.",
230
	},
231
	["some iron"] = {
232
		aliases = { "iron" },
233
		material = true,
234
		ore = true,
235
		toolLevel = 2,
236
		toolType = "pick",
237
		desc = "That iron looks mighty strong, you'll need a stone pickaxe to mine it.",
238
	},
239
	["some diamond"] = {
240
		aliases = { "diamond", "diamonds" },
241
		material = true,
242
		ore = true,
243
		toolLevel = 3,
244
		toolType = "pick",
245
		desc = "Sparkly, rare, and impossible to mine without an iron pickaxe.",
246
	},
247
	["some torches"] = {
248
		aliases = { "torches", "torch" },
249
		desc = "These won't run out for a while.",
250
	},
251
	["a torch"] = {
252
		aliases = { "torch" },
253
		desc = "Fire, fire, burn so bright, won't you light my cave tonight?",
254
	},
255
	["some wool"] = {
256
		aliases = { "wool" },
257
		material = true,
258
		desc = "Soft and good for building.",
259
	},
260
	["some pork"] = {
261
		aliases = { "pork", "porkchops" },
262
		food = true,
263
		desc = "Delicious and nutricious.",
264
	},
265
	["some chicken"] = {
266
		aliases = { "chicken" },
267
		food = true,
268
		desc = "Finger licking good.",
269
	},
270
}
271
272
local tAnimals = {
273
	"a pig", "a cow", "a sheep", "a chicken",
274
}
275
276
local tMonsters = {
277
	"a creeper", "a skeleton", "a zombie", "a spider"
278
}
279
280
local tRecipes = {
281
	["some planks"] = { "some wood" },
282
	["some sticks"] = { "some planks" },
283
	["some sticks"] = { "some planks" },
284
	["a crafting table"] = { "some planks" },
285
	["a furnace"] = { "some stone" },
286
	["some torches"] = { "some sticks", "some coal" },
287
	
288
	["a wooden pickaxe"] = { "some planks", "some sticks" },
289
	["a stone pickaxe"] = { "some stone", "some sticks" },
290
	["an iron pickaxe"] = { "some iron", "some sticks" },
291
	["a diamond pickaxe"] = { "some diamond", "some sticks" },
292
293
	["a wooden sword"] = { "some planks", "some sticks" },
294
	["a stone sword"] = { "some stone", "some sticks" },
295
	["an iron sword"] = { "some iron", "some sticks" },
296
	["a diamond sword"] = { "some diamond", "some sticks" },
297
298
	["a wooden shovel"] = { "some planks", "some sticks" },
299
	["a stone shovel"] = { "some stone", "some sticks" },
300
	["an iron shovel"] = { "some iron", "some sticks" },
301
	["a diamond shovel"] = { "some diamond", "some sticks" },
302
}
303
304
local tGoWest = {
305
	"(life is peaceful there)",
306
	"(lots of open air)",
307
	"(to begin life anew)",
308
	"(this is what we'll do)",
309
	"(sun in winter time)",
310
	"(we will do just fine)",
311
	"(where the skies are blue)",
312
	"(this and more we'll do)",
313
}
314
local nGoWest = 0
315
316
local bRunning = true
317
local tMap = { { {}, }, }
318
local x,y,z = 0,0,0
319
local inventory = {
320
	["no tea"] = items["no tea"],
321
}
322
323
local nTurn = 0
324
local nTimeInRoom = 0
325
local bInjured = false
326
327
local tDayCycle = {
328
	"It is daytime.",
329
	"It is daytime.",
330
	"It is daytime.",
331
	"It is daytime.",
332
	"It is daytime.",
333
	"It is daytime.",
334
	"It is daytime.",
335
	"It is daytime.",
336
	"The sun is setting.",
337
	"It is night.",
338
	"It is night.",
339
	"It is night.",
340
	"It is night.",
341
	"It is night.",
342
	"The sun is rising.",
343
}
344
345
local function getTimeOfDay()
346
	return math.fmod( math.floor(nTurn/3), #tDayCycle ) + 1
347
end
348
349
local function isSunny()
350
	return (getTimeOfDay() < 10)
351
end
352
353
local function getRoom( x, y, z, dontCreate )
354
	tMap[x] = tMap[x] or {}
355
	tMap[x][y] = tMap[x][y] or {}
356
	if not tMap[x][y][z] and dontCreate ~= true then
357
 		local room = {
358
 			items = {},
359
 			exits = {},
360
 			nMonsters = 0,
361
 		}
362
		tMap[x][y][z] = room
363
		
364
		if y == 0 then
365
			-- Room is above ground
366
367
			-- Pick biome
368
			room.nBiome = math.random( 1, #tBiomes )
369
			room.trees = hasTrees( room.nBiome )
370
		
371
			-- Add animals
372
			if math.random(1,3) == 1 then
373
				for n = 1,math.random(1,2) do
374
					local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ]
375
					room.items[ sAnimal ] = items[ sAnimal ]
376
				end
377
			end
378
			
379
			-- Add surface ore
380
			if math.random(1,5) == 1 or hasStone( room.nBiome ) then
381
				room.items[ "some stone" ] = items[ "some stone" ]
382
			end
383
			if math.random(1,8) == 1 then
384
				room.items[ "some coal" ] = items[ "some coal" ]
385
			end
386
			if math.random(1,8) == 1 and hasRivers( room.nBiome ) then
387
				room.items[ "a river" ] = items[ "a river" ]
388
			end
389
390
			-- Add exits
391
			room.exits = {
392
				["north"] = true,
393
				["south"] = true,
394
				["east"] = true,
395
				["west"] = true,
396
			}
397
			if math.random(1,8) == 1 then
398
				room.exits["down"] = true
399
				room.items["a cave entrance"] = items["a cave entrance"]
400
			end
401
						
402
		else
403
			-- Room is underground
404
			-- Add exits
405
			local function tryExit( sDir, sOpp, x, y, z )
406
				local adj = getRoom( x, y, z, true )
407
				if adj then
408
					if adj.exits[sOpp] then
409
						room.exits[sDir] = true
410
					end
411
				else
412
					if math.random(1,3) == 1 then
413
						room.exits[sDir] = true
414
					end
415
				end
416
			end
417
			
418
			if y == -1 then
419
				local above = getRoom( x, y + 1, z )
420
				if above.exits["down"] then
421
					room.exits["up"] = true
422
					room.items["an exit to the surface"] = items["an exit to the surface"]
423
				end
424
			else
425
				tryExit( "up", "down", x, y + 1, z )
426
			end
427
			
428
			if y > -3 then
429
				tryExit( "down", "up", x, y - 1, z )
430
			end
431
			
432
			tryExit( "east", "west", x - 1, y, z )
433
			tryExit( "west", "east", x + 1, y, z )
434
			tryExit( "north", "south", x, y, z + 1 )
435
			tryExit( "south", "north", x, y, z - 1 )	
436
			
437
			-- Add ores
438
			room.items[ "some stone" ] = items[ "some stone" ]
439
			if math.random(1,3) == 1 then
440
				room.items[ "some coal" ] = items[ "some coal" ]
441
			end
442
			if math.random(1,8) == 1 then
443
				room.items[ "some iron" ] = items[ "some iron" ]
444
			end
445
			if y == -3 and math.random(1,15) == 1 then
446
				room.items[ "some diamond" ] = items[ "some diamond" ]
447
			end
448
			
449
			-- Turn out the lights
450
			room.dark = true
451
		end
452
	end
453
	return tMap[x][y][z]
454
end
455
456
local function itemize( t )
457
	local item = next( t )
458
	if item == nil then
459
		return "nothing"
460
	end
461
	
462
	local text = ""
463
	while item do
464
		text = text .. item
465
		
466
		local nextItem = next( t, item )
467
		if nextItem ~= nil then
468
			local nextNextItem = next( t, nextItem )
469
			if nextNextItem == nil then
470
				text = text .. " and "
471
			else
472
				text = text .. ", "
473
			end
474
		end
475
		item = nextItem
476
	end
477
	return text
478
end
479
480
function findItem( _tList, _sQuery )
481
	for sItem, tItem in pairs( _tList ) do
482
		if sItem == _sQuery then
483
			return sItem
484
		end
485
		if tItem.aliases ~= nil then
486
			for n, sAlias in pairs( tItem.aliases ) do
487
				if sAlias == _sQuery then
488
					return sItem
489
				end
490
			end
491
		end
492
	end
493
	return nil
494
end
495
496
local tMatches = {
497
	["wait"] = {
498
		"wait",
499
	},
500
	["jump"] = {
501
		"jump",
502
	},
503
	["sleep"] = {
504
		"sleep",
505
	},
506
	["fuck"] = {
507
		"fuck",
508
		"shit",
509
		"cunt",
510
	},
511
	["die"] = {
512
		"die",
513
		"suicide",
514
	},
515
	["point"] = {
516
		"point"
517
	},
518
	["look"] = {
519
		"look at the ([%a ]+)",
520
		"look at ([%a ]+)",
521
		"look",
522
		"inspect ([%a ]+)",
523
		"inspect the ([%a ]+)",
524
		"inspect",
525
	},
526
	["inventory"] = {
527
		"check self",
528
		"check inventory",
529
		"inventory",
530
		"i",
531
	},
532
	["go"] = {
533
		"go (%a+)",
534
		"travel (%a+)",
535
		"walk (%a+)",
536
		"run (%a+)",
537
		"go",
538
	},
539
	["dig"] = {
540
		"dig (%a+) using ([%a ]+)",
541
		"dig (%a+) with ([%a ]+)",
542
		"dig (%a+)",
543
		"dig",
544
	},
545
	["take"] = {
546
		"pick up the ([%a ]+)",
547
		"pick up ([%a ]+)",
548
		"pickup ([%a ]+)",
549
		"take the ([%a ]+)",
550
		"take ([%a ]+)",
551
		"take",
552
	},
553
	["drop"] = {
554
		"put down the ([%a ]+)",
555
		"put down ([%a ]+)",
556
		"drop the ([%a ]+)",
557
		"drop ([%a ]+)",
558
		"drop",
559
	},
560
	["place"] = {
561
		"place the ([%a ]+)",
562
		"place ([%a ]+)",
563
		"place",
564
	},
565
	["cbreak"] = {
566
		"punch the ([%a ]+)",
567
		"punch ([%a ]+)",
568
		"punch",
569
		"break the ([%a ]+) with the ([%a ]+)",
570
		"break ([%a ]+) with ([%a ]+) ",
571
		"break the ([%a ]+)",
572
		"break ([%a ]+)",
573
		"break",
574
	},
575
	["mine"] = {
576
		"mine the ([%a ]+) with the ([%a ]+)",
577
		"mine ([%a ]+) with ([%a ]+)",
578
		"mine ([%a ]+)",
579
		"mine",
580
	},
581
	["attack"] = {
582
		"attack the ([%a ]+) with the ([%a ]+)",
583
		"attack ([%a ]+) with ([%a ]+)",
584
		"attack ([%a ]+)",
585
		"attack",
586
		"kill the ([%a ]+) with the ([%a ]+)",
587
		"kill ([%a ]+) with ([%a ]+)",
588
		"kill ([%a ]+)",
589
		"kill",
590
		"hit the ([%a ]+) with the ([%a ]+)",
591
		"hit ([%a ]+) with ([%a ]+)",
592
		"hit ([%a ]+)",
593
		"hit",
594
	},
595
	["craft"] = {
596
		"craft a ([%a ]+)",
597
		"craft some ([%a ]+)",
598
		"craft ([%a ]+)",
599
		"craft",
600
		"make a ([%a ]+)",
601
		"make some ([%a ]+)",
602
		"make ([%a ]+)",
603
		"make",
604
	},
605
	["build"] = {
606
		"build ([%a ]+) out of ([%a ]+)",
607
		"build ([%a ]+) from ([%a ]+)",
608
		"build ([%a ]+)",
609
		"build",
610
	},
611
	["eat"] = {
612
		"eat a ([%a ]+)",
613
		"eat the ([%a ]+)",
614
		"eat ([%a ]+)",
615
		"eat",
616
	},
617
	["help"] = {
618
		"help me",
619
		"help",
620
	},
621
	["exit"] = {
622
		"exit",
623
		"quit",
624
		"goodbye",
625
		"good bye",
626
		"bye",
627
		"farewell",
628
	},
629
}
630
631
local commands = {}
632
function doCommand( text )
633
	if text == "" then
634
		commands[ "noinput" ]()
635
		return
636
	end
637
	
638
	for sCommand, t in pairs( tMatches ) do
639
		for n, sMatch in pairs( t ) do
640
			local tCaptures = { string.match( text, "^" .. sMatch .. "$" ) }
641
			if #tCaptures ~= 0 then
642
				local fnCommand = commands[ sCommand ]
643
				if #tCaptures == 1 and tCaptures[1] == sMatch then
644
					fnCommand()
645
				else
646
					fnCommand( table.unpack( tCaptures ) )
647-
			io.write( "You are standing " .. tBiomes[room.nBiome] .. ". " )
647+
648-
			print( tDayCycle[ getTimeOfDay() ] )
648+
649
			end
650-
			io.write( "You are underground. " )
650+
651-
			if next( room.exits ) ~= nil then
651+
652-
				print( "You can travel "..itemize( room.exits ).."." )
652+
653
end
654-
				print()
654+
655
function commands.wait()
656
	print( "Time passes..." )
657
end
658
659
function commands.jump()
660
	print( "Sorry, this game is in a NO JUMPING zone." )
661
end
662
663
function commands.fuck()
664
	print( "A mind is a terrible thing to waste." )
665
end
666
667
function commands.sleep()
668
	print( "Now isn't the time, nor will it ever be while MINECRAFT is up." )
669-
			print( "Very handsome." )
669+
670
671
function commands.point()
672
	print( "It's rude to point." )
673
end
674
675
function commands.die()
676
	if term.isColour() then
677
		term.setTextColour( colours.red )
678
	end
679
	print( "That was really stupid. You're dead." )
680
	print( "Score: &e0" )
681
	term.setTextColour( colours.white )
682
	print( "Thank you for playing Adventure! As usual, you've been a real pantload." )
683
	bRunning = false
684
	return
685
end
686
687
function commands.look( _sTarget )
688
	local room = getRoom( x,y,z )
689
	if room.dark then
690
		print( "It is pitch dark." )
691
		return
692
	end
693
694
	if _sTarget == nil then
695
		-- Look at the world
696
		if y == 0 then
697
			print( "You are standing " .. tBiomes[room.nBiome] .. ". " .. tDayCycle[ getTimeOfDay() ])
698
		else
699
			print( "You are underground. " .. (next( room.exits ) ~= nil and ("You can travel "..itemize( room.exits )..".") or "") )
700
		end
701
		if next( room.items ) ~= nil then
702
			print( "There is " .. itemize( room.items ) .. " here." )
703
		end
704
		if room.trees then
705
			print( "There are trees here." )
706
		end
707
		
708
	else
709
		-- Look at stuff
710
		if room.trees and (_sTarget == "tree" or _sTarget == "trees") then
711
			print( "The trees look easy to break." )
712
		elseif _sTarget == "self" or _sTarget == "myself" then
713-
		print( "You can't go that way." )
713+
			print( "You don't want to gaze at your own ugly mug." )
714
		else
715
			local tItem = nil
716
			local sItem = findItem( room.items, _sTarget )
717
			if sItem then
718
				tItem = room.items[sItem]
719
			else
720
				sItem = findItem( inventory, _sTarget )
721
				if sItem then
722
					tItem = inventory[sItem]
723
				end
724
			end
725
			
726
			if tItem then
727
				print( tItem.desc or ("You see nothing special about "..sItem..".") )
728
			else
729
				print( "You don't see any ".._sTarget.." here." )
730
			end
731
		end
732
	end
733
end
734
735
function commands.go( _sDir )
736
	local room = getRoom( x,y,z )
737
	if _sDir == nil then
738
		print( "Go where?" )
739
		return
740
	elseif _sDir == "self" then
741
		print("You enter your inner psyche. Then you quickly scurry out.")
742
	end
743
	
744
	if nGoWest ~= nil then
745
		if _sDir == "west" then
746
			nGoWest = nGoWest + 1
747
			if nGoWest > #tGoWest then
748
				nGoWest = 1
749
			end
750
			print( tGoWest[ nGoWest ] )
751
		else
752
			if nGoWest > 0 or nTurn > 6 then
753
				nGoWest = nil
754
			end
755
		end
756
	end
757
	
758
	if room.exits[_sDir] == nil then
759
		local goRejections = {
760
			"You can't go that way.",
761
			"It's a real shame you can't go that way, I hear it's quite peaceful.",
762
			"That isn't a direction you can go in.",
763
			"There's no way there's a way that way.",
764
			"You can't move in that direction.",
765
		}
766
		print( goRejections[ math.random(1,#goRejections) ] )
767
		return
768
	end
769
	
770
	if _sDir == "north" then
771
		z = z + 1
772
	elseif _sDir == "south" then
773
		z = z - 1
774
	elseif _sDir == "east" then
775
		x = x - 1
776
	elseif _sDir == "west" then
777
		x = x + 1
778
	elseif _sDir == "up" then
779
		y = y + 1
780
	elseif _sDir == "down" then
781
		y = y - 1
782
	else
783
		print( "I don't understand that direction." )
784
		return
785
	end
786
	
787
	nTimeInRoom = 0
788
	doCommand( "look" )
789
end
790
791
function commands.dig( _sDir, _sTool )
792
	local room = getRoom( x,y,z )
793
	if _sDir == nil then
794
		print( "Dig where?" )
795
		return
796
	end
797
	
798
	local sTool = nil
799
	local tTool = nil
800
	if _sTool ~= nil then
801
		sTool = findItem( inventory, _sTool )
802
		if not sTool then
803
			print( "You're not carrying a ".._sTool.."." )
804
			return
805
		end
806
		tTool = inventory[ sTool ]
807
	end
808
	
809
	local room = getRoom( x, y, z )
810
	local bActuallyDigging = (room.exits[ _sDir ] ~= true)
811
	if bActuallyDigging then
812
		if sTool == nil or tTool.toolType ~= "pick" then
813
			print( "You need to use a pickaxe to dig through stone." )
814
			return
815
		end
816
	end
817
	
818
	if _sDir == "north" then
819
		room.exits["north"] = true
820
		z = z + 1
821
		getRoom( x, y, z ).exits["south"] = true
822
823
	elseif _sDir == "south" then
824
		room.exits["south"] = true
825
		z = z - 1
826
		getRoom( x, y, z ).exits["north"] = true
827
		
828
	elseif _sDir == "east" then
829
		room.exits["east"] = true
830
		x = x - 1
831
		getRoom( x, y, z ).exits["west"] = true
832
		
833
	elseif _sDir == "west" then
834
		room.exits["west"] = true
835
		x = x + 1
836
		getRoom( x, y, z ).exits["east"] = true
837
		
838
	elseif _sDir == "up" then
839
		if y == 0 then
840
			print( "You can't dig that way." )
841
			return
842
		end
843
844
		room.exits["up"] = true
845
		if y == -1 then
846
			room.items[ "an exit to the surface" ] = items[ "an exit to the surface" ]
847
		end
848
		y = y + 1
849
		
850
		room = getRoom( x, y, z )
851
		room.exits["down"] = true
852
		if y == 0 then
853
			room.items[ "a cave entrance" ] = items[ "a cave entrance" ]
854
		end
855
		
856
	elseif _sDir == "down" then
857
		if y <= -3 then
858
			print( "You hit bedrock." )
859
			return
860
		end
861
862
		room.exits["down"] = true
863
		if y == 0 then
864
			room.items[ "a cave entrance" ] = items[ "a cave entrance" ]
865
		end
866
		y = y - 1
867
		
868
		room = getRoom( x, y, z )
869
		room.exits["up"] = true
870
		if y == -1 then
871
			room.items[ "an exit to the surface" ] = items[ "an exit to the surface" ]
872
		end
873
		
874
	else
875
		print( "I don't understand that direction." )
876
		return
877
	end
878
	
879
	--
880
	if bActuallyDigging then
881
		if _sDir == "down" and y == -1 or
882
		   _sDir == "up" and y == 0 then
883
			inventory[ "some dirt" ] = items[ "some dirt" ]
884
			inventory[ "some stone" ] = items[ "some stone" ]
885
			print( "You dig ".._sDir.." using "..sTool.." and collect some dirt and stone." )
886
		else
887
			inventory[ "some stone" ] = items[ "some stone" ]
888
			print( "You dig ".._sDir.." using "..sTool.." and collect some stone." )
889
		end
890
	end
891
	
892
	nTimeInRoom = 0
893
	doCommand( "look" )
894
end
895
896
function commands.inventory()
897
	print( "You are carrying " .. itemize( inventory ) .. "." )
898
end
899
900
function commands.drop( _sItem )
901
	if _sItem == nil then
902
		print( "Drop what?" )
903
		return
904
	end
905
	
906
	local room = getRoom( x,y,z )
907
	local sItem = findItem( inventory, _sItem )
908
	if sItem then
909
		local tItem = inventory[ sItem ]
910
		if tItem.droppable == false then
911
			print( "You can't drop that." )
912
		else
913
			room.items[ sItem ] = tItem
914
			inventory[ sItem ] = nil
915
			print( "Dropped." )
916
		end
917
	else
918
		print( "You don't have a ".._sItem.."." )
919
	end
920
end
921
922
function commands.place( _sItem )
923
	if _sItem == nil then
924
		print( "Place what?" )
925
		return
926
	end
927
	
928
	if _sItem == "torch" or _sItem == "a torch" then
929
		local room = getRoom( x,y,z )
930
		if inventory["some torches"] or inventory["a torch"] then
931
			inventory["a torch"] = nil
932
			room.items["a torch"] = items["a torch"]
933
			if room.dark then
934
				print( "The cave lights up under the torchflame." )
935
				room.dark = false
936
			elseif y == 0 and not isSunny() then
937
				print( "The night gets a little brighter." )
938
			else
939
				print( "Placed." )
940
			end
941
		else
942
			print( "You don't have torches." )
943
		end
944
		return
945
	end
946
	
947
	commands.drop( _sItem )
948
end
949
950
function commands.take( _sItem )
951
	if _sItem == nil then
952
		print( "Take what?" )
953
		return
954
	end
955
956
	local room = getRoom( x,y,z )
957
	local sItem = findItem( room.items, _sItem )
958
	if sItem then
959
		local tItem = room.items[ sItem ]
960
		if tItem.heavy == true then
961
			print( "You can't carry "..sItem.."." )
962
		elseif tItem.ore == true then
963
			print( "You need to mine this ore." )
964
		else
965
			if tItem.infinite ~= true then
966
				room.items[ sItem ] = nil
967
			end
968
			inventory[ sItem ] = tItem
969
			
970
			if inventory["some torches"] and inventory["a torch"] then
971
				inventory["a torch"] = nil
972
			end
973
			if sItem == "a torch" and y < 0 then
974
				room.dark = true
975
				print( "The cave plunges into darkness." )
976-
		print( "You have died." )
976+
977
				print( "Taken." )
978
			end
979
		end
980
	else
981
		print( "You don't see a ".._sItem.." here." )
982
	end
983
end
984
985
function commands.mine( _sItem, _sTool )
986
	if _sItem == nil then
987
		print( "Mine what?" )
988
		return
989
	end
990
	if _sTool == nil then
991
		print( "Mine ".._sItem.." with what?" )
992
		return
993
	end	
994
	commands.cbreak( _sItem, _sTool )
995
end
996
997
function commands.attack( _sItem, _sTool )
998
	if _sItem == nil then
999
		print( "Attack what?" )
1000
		return
1001
	end
1002
	commands.cbreak( _sItem, _sTool )
1003
end
1004
1005
function commands.cbreak( _sItem, _sTool )
1006
	if _sItem == nil then
1007
		print( "Break what?" )
1008
		return
1009
	end
1010
	
1011
	local sTool = nil
1012
	if _sTool ~= nil then
1013
		sTool = findItem( inventory, _sTool )
1014
		if sTool == nil then
1015
			print( "You're not carrying a ".._sTool.."." )
1016
			return
1017
		end
1018
	end
1019
1020
	local room = getRoom( x,y,z )
1021
	if _sItem == "tree" or _sItem == "trees" or _sItem == "a tree" then
1022
		print( "The tree breaks into blocks of wood, which you pick up." )
1023
		inventory[ "some wood" ] = items[ "some wood" ]
1024
		return
1025
	elseif _sItem == "self" or _sItem == "myself" then
1026
		if term.isColour() then
1027
			term.setTextColour( colours.red )
1028
		end
1029
		print( "That wasn't very smart. You dead." )
1030
		print( "Score: &e0" )
1031
		term.setTextColour( colours.white )
1032
		print( "Thank you for playing Adventure! As usual, you've been a real pantload." )
1033
		bRunning = false
1034
		return
1035
	end
1036
	
1037
	local sItem = findItem( room.items, _sItem )
1038
	if sItem then
1039
		local tItem = room.items[ sItem ]
1040
		if tItem.ore == true then
1041
			-- Breaking ore
1042
			if not sTool then
1043
				print( "You need a tool to break this ore." )
1044
				return
1045
			end
1046
			local tTool = inventory[ sTool ]
1047
			if tTool.tool then
1048
				if tTool.toolLevel < tItem.toolLevel then
1049
					print( sTool .." is not strong enough to break this ore." )
1050
				elseif tTool.toolType ~= tItem.toolType then
1051
					print( "You need a different kind of tool to break this ore." )
1052
				else
1053
					print( "The ore breaks, dropping "..sItem..", which you pick up." )
1054
					inventory[ sItem ] = items[ sItem ]
1055
					if tItem.infinite ~= true then
1056
						room.items[ sItem ] = nil
1057
					end
1058
				end
1059
			else
1060
				print( "You can't break "..sItem.." with "..sTool..".")
1061
			end
1062
			
1063
		elseif tItem.creature == true then
1064
			-- Fighting monsters (or pigs)
1065-
		print( "By creating a computer in a computer in a computer, you tear a hole in the spacetime continuum from which no mortal being can escape." )
1065+
1066
			local tTool = nil
1067
			if sTool then
1068
				tTool = inventory[ sTool ]
1069-
		print( "You have died." )
1069+
1070
					toolLevel = tTool.toolLevel
1071
				end
1072
			end
1073
						
1074
			local tChances = { 0.2, 0.4, 0.55, 0.8, 1 }
1075
			if math.random() <= tChances[ toolLevel + 1 ] then
1076
				room.items[ sItem ] = nil
1077
				print( "The "..tItem.aliases[1].." dies." )
1078
	
1079
				if tItem.drops then
1080
					for n, sDrop in pairs( tItem.drops ) do
1081
						if not room.items[sDrop] then
1082
							print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
1083
							room.items[sDrop] = items[sDrop]
1084
						end
1085
					end
1086
				end
1087
				
1088
				if tItem.monster then
1089
					room.nMonsters = room.nMonsters - 1
1090
				end
1091
			else
1092
				print( "The "..tItem.aliases[1].." is injured by your blow." )
1093
			end
1094
			
1095
			if tItem.hitDrops then
1096
				for n, sDrop in pairs( tItem.hitDrops ) do
1097
					if not room.items[sDrop] then
1098
						print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
1099
						room.items[sDrop] = items[sDrop]
1100
					end
1101
				end
1102
			end
1103
		
1104
		else
1105
			print( "You can't break "..sItem.."." )
1106
		end
1107
	else
1108
		print( "You don't see a ".._sItem.." here." )
1109
	end
1110
end
1111
1112
function commands.craft( _sItem )
1113
	if _sItem == nil then
1114
		print( "Craft what?" )
1115
		return
1116
	end
1117
	
1118
	if _sItem == "computer" or _sItem == "a computer" then
1119
		print( "By creating a computer in a computer in a computer, you tear a hole in the spacetime continuum from which no mortal can escape." )
1120
		if term.isColour() then
1121
			term.setTextColour( colours.red )
1122
		end
1123
		print( "You have ceased to exist." )
1124
		print( "Score: &e0" )
1125
		term.setTextColour( colours.white )
1126
		print( "Thank you for playing Adventure! As usual, you've been a real pantload." )
1127
		bRunning = false
1128
		return
1129
	end
1130
	
1131
	local room = getRoom( x,y,z )
1132
	local sItem = findItem( items, _sItem )
1133
	local tRecipe = (sItem and tRecipes[ sItem ]) or nil
1134
	if tRecipe then
1135
		for n,sReq in ipairs( tRecipe ) do
1136
			if inventory[sReq] == nil then
1137
				print( "You don't have the items you need to craft "..sItem.."." )
1138
				return
1139
			end
1140
		end
1141
		
1142
		for n,sReq in ipairs( tRecipe ) do
1143
			inventory[sReq] = nil
1144
		end
1145
		inventory[ sItem ] = items[ sItem ]
1146
		if inventory["some torches"] and inventory["a torch"] then
1147
			inventory["a torch"] = nil
1148
		end
1149
		print( "Crafted." )
1150
	else
1151
		print( "You don't know how to make "..(sItem or _sItem).."." )
1152
	end	
1153
end
1154
1155
function commands.build( _sThing, _sMaterial )
1156
	if _sThing == nil then
1157
		print( "Build what?" )
1158
		return
1159
	elseif _sThing == "self" then
1160
		print( "Building yourself up sounds like a good idea, but this isn't how you do it." )
1161
		return
1162
	end
1163
	local sMaterial = nil
1164
	if _sMaterial == nil then
1165
		for sItem, tItem in pairs( inventory ) do
1166
			if tItem.material then
1167
				sMaterial = sItem
1168
				break
1169
			end
1170
		end
1171
		if sMaterial == nil then
1172
			print( "You don't have any building materials." )
1173
			return
1174
		end
1175
	else
1176
		sMaterial = findItem( inventory, _sMaterial )
1177
		if not sMaterial then
1178
			print( "You don't have any ".._sMaterial )
1179
			return
1180
		end
1181
		
1182
		if inventory[sMaterial].material ~= true then
1183
			print( sMaterial.." is not a good building material." )
1184
			return
1185
		end
1186
	end
1187
	
1188
	local alias = nil
1189
	if string.sub(_sThing, 1, 1) == "a" then
1190
		alias = string.match( _sThing, "a ([%a ]+)" )
1191
	end
1192
	
1193
	local room = getRoom( x,y,z )
1194
	inventory[sMaterial] = nil
1195
	room.items[ _sThing ] = {
1196
		heavy = true,
1197
		aliases = { alias },
1198
		desc = "As you look at your creation (made from "..sMaterial.."), you feel a swelling sense of pride.",
1199-
		"What?",
1199+
1200
1201
	print( "Your construction is complete." )
1202
end
1203
1204
function commands.help()
1205
	local sText = 
1206
		"Welcome to adventure, the greatest text adventure game on CraftOS. " ..
1207
		"To get around the world, type actions, and the adventure will " ..
1208
		"be read back to you. The actions availiable to you are go, look, inspect, inventory, " ..
1209
		"take, drop, place, punch, attack, mine, dig, craft, build, eat and exit."
1210
	print( sText )
1211
end
1212
1213
function commands.eat( _sItem )
1214
	if _sItem == nil then
1215
		print( "Eat what?" )
1216
		return
1217
	end
1218
1219
	local sItem = findItem( inventory, _sItem )
1220
	if not sItem then
1221
		print( "You don't have any ".._sItem.."." )
1222
		return
1223
	end
1224
	
1225
	local tItem = inventory[sItem]
1226
	if tItem.food then
1227
		print( "That was delicious!" )
1228
		inventory[sItem] = nil
1229
		
1230
		if bInjured then
1231
			print( "You are no longer injured." )
1232
			bInjured = false
1233
		end
1234
	else
1235
		print( "You can't eat "..sItem.."." )
1236
	end
1237
end
1238
1239
function commands.exit()
1240
	bRunning = false
1241
end
1242
1243
function commands.badinput()
1244
	local tResponses = {
1245
		"I don't understand.",
1246
		"I don't understand you.",
1247
		"You can't do that.",
1248
		"Nope.",
1249
		"Huh?",
1250
		"Say again?",
1251
		"That's crazy talk.",
1252
		"Speak clearly.",
1253
		"I'll think about it.",
1254
		"Let me get back to you on that one.",
1255
		"That doesn't make any sense.",
1256
		_USERNAME..", have you been at that marijuana gin again?",
1257
		"You what?",
1258
	}
1259
	print( tResponses[ math.random(1,#tResponses) ] )
1260
end
1261
1262
function commands.noinput()
1263
	local tResponses = {
1264
		"Speak up.",
1265
		"Enunciate.",
1266
		"Project your voice.",
1267
		"Don't be shy.",
1268
		"Use your words.",
1269
		"Say something rather than nothing.",
1270
	}
1271
	print( tResponses[ math.random(1,#tResponses) ] )
1272
end
1273
1274
local function simulate()
1275
	local bNewMonstersThisRoom = false
1276
	
1277
	-- Spawn monsters in nearby rooms
1278
	for sx = -2,2 do
1279
		for sy = -1,1 do
1280
			for sz = -2,2 do
1281
				local h = y + sy
1282
				if h >= -3 and h <= 0 then
1283
					local room = getRoom( x + sx, h, z + sz )
1284
					
1285
					-- Spawn monsters
1286
					if room.nMonsters < 2 and
1287
					   ((h == 0 and not isSunny() and not room.items["a torch"]) or room.dark) and
1288
					   math.random(1,6) == 1 then
1289
					   
1290
						local sMonster = tMonsters[ math.random(1,#tMonsters) ]
1291
						if room.items[ sMonster ] == nil then
1292
					   		room.items[ sMonster ] = items[ sMonster ]
1293
					   		room.nMonsters = room.nMonsters + 1
1294
					   		
1295
					   		if sx == 0 and sy == 0 and sz == 0 and not room.dark then
1296
					   			print( "From the shadows, "..sMonster.." appears." )
1297
					   			bNewMonstersThisRoom = true
1298
					   		end
1299
						end	
1300
					end
1301
					
1302
					-- Burn monsters
1303
					if h == 0 and isSunny() then
1304
						for n,sMonster in ipairs( tMonsters ) do
1305
							if room.items[sMonster] and items[sMonster].nocturnal then
1306
								room.items[sMonster] = nil
1307
						   		if sx == 0 and sy == 0 and sz == 0 and not room.dark then
1308
						   			print( "With the sun high in the sky, the "..items[sMonster].aliases[1].." bursts into flame and dies." )
1309
						   		end
1310
						   		room.nMonsters = room.nMonsters - 1
1311
						   	end
1312
						end
1313
					end	
1314
				end
1315
			end
1316
		end
1317
	end
1318
1319
	-- Make monsters attack
1320
	local room = getRoom( x, y, z )
1321
	if nTimeInRoom >= 2 and not bNewMonstersThisRoom then
1322-
		term.setTextColour( colours.yellow )
1322+
1323
			if room.items[sMonster] then
1324-
    write( "? " )
1324+
1325
				   not (y == 0 and isSunny() and (sMonster == "a spider")) then
1326
					if sMonster == "a creeper" then
1327-
    local sRawLine = read( nil, tCommandHistory )
1327+
1328
							print( "A creeper explodes." )
1329
						else
1330
							print( "The creeper explodes." )
1331
						end
1332
						room.items[sMonster] = nil
1333
						room.nMonsters = room.nMonsters - 1
1334
					else
1335
						if room.dark then
1336
							print( "A "..items[sMonster].aliases[1].." attacks you." )
1337
						else
1338
							print( "The "..items[sMonster].aliases[1].." attacks you." )
1339
						end
1340
					end
1341
					
1342
					if bInjured then
1343
						if term.isColour() then
1344
							term.setTextColour( colours.red )
1345
						end
1346
						print( "You have died." )
1347
						print( "Score: &e0" )
1348
						term.setTextColour( colours.white )
1349
						print( "Thank you for playing Adventure! As usual, you've been a real pantload." )
1350
						bRunning = false
1351
						return
1352
					else
1353
						bInjured = true
1354
					end
1355
					
1356
					break
1357
				end
1358
			end
1359
		end
1360
	end
1361
	
1362
	-- Always print this
1363
	if bInjured then
1364
		if term.isColour() then
1365
			term.setTextColour( colours.red )
1366
		end
1367
		print( "You are injured." )
1368
		term.setTextColour( colours.white )
1369
	end
1370
	
1371
	-- Advance time
1372
	nTurn = nTurn + 1
1373
	nTimeInRoom = nTimeInRoom + 1
1374
end
1375
1376
doCommand( "look" )
1377
simulate()
1378
1379
local tCommandHistory = {}
1380
while bRunning do
1381
	term.setTextColour( colours.white )
1382
		
1383
    local evt, sRawLine = os.pullEvent("followup_command_".._USERNAME)
1384
    table.insert( tCommandHistory, sRawLine )
1385
    
1386
    local sLine = nil
1387
	for match in string.gmatch(sRawLine, "%a+") do
1388
		if sLine then
1389
			sLine = sLine .. " " .. string.lower(match)
1390
		else
1391
			sLine = string.lower(match)
1392
		end
1393
	end
1394
	
1395
	doCommand( sLine or "" )
1396
    if bRunning then
1397
	    simulate()
1398
	end
1399
end