This file is indexed.

/usr/share/freedroidrpg/dialogs/TutorialTom.lua is in freedroidrpg-data 0.16.1-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

   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
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
---------------------------------------------------------------------
-- This file is part of Freedroid
--
-- Freedroid is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- Freedroid is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Freedroid; see the file COPYING. If not, write to the
-- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-- MA 02111-1307 USA
----------------------------------------------------------------------
--[[WIKI
PERSONALITY = { "Helpful" },
PURPOSE = "$$NAME$$ guides the player through the various aspects of playing the game."
WIKI]]--

local Npc = FDrpg.get_npc()
local Tux = FDrpg.get_tux()

-- helper functions for the quickmenu thingy

local function tutorial_chests_and_armor_and_shops()
	tut_tux_items_entered = true
	tut_tux_chest_entered = true
end

local function tutorial_melee_combat()
	tutorial_chests_and_armor_and_shops()

	tut_tux_melee_entered = true
	Tux:add_item("Normal Jacket")
	Tux:add_item("Improvised Buckler")
	Tux:add_item("Shoes")
	Tux:add_item("Worker Helmet")
end

local function tutorial_abilities()
	tutorial_melee_combat()

	tut_tux_terminal_entered = true
end

local function tutorial_upgrade_items_and_terminal()
	tutorial_abilities()
end

local function tutorial_hacking()
	tutorial_upgrade_items_and_terminal()

	tut_tux_takeover_entered = true
end

local function tutorial_ranged_combat()
	tutorial_hacking()

	tut_tux_glass_entered = true
end

local items_up = {"Entropy Inverter", "Tachyon Condensator", "Antimatter-Matter Converter", "Superconducting Relay Unit", "Plasma Transistor"}

-- actual dialog

return {
	FirstTime = function()
		-- initialize
		TutorialTom_doors = {"TutorialEntry", "TutorialZigzag1", "TutorialZigzag2", "TutorialZigzag3", "TutorialZigzag4"}
		TutorialTom_doors2 = {TutorialTom_doors[1], TutorialTom_doors[2], TutorialTom_doors[3], TutorialTom_doors[4], TutorialTom_doors[5], "TutorialEquipOut", "TutorialMeleeOut", "TutorialDoor", "TutorialGlasswallDoor", "TutorialStorage", "TutorialTakeover", "TutorialExit1"}
		ranged_combat = {"Normal Jacket", "Big kitchen knife", "Shoes", "Standard Shield", "Worker Helmet"}
		-- to avoid excessive map validator waypoint errors, map starts with all relevant doors open, so we need to close them here
		for var in ipairs(TutorialTom_doors2) do
			change_obstacle_state(TutorialTom_doors2[var], "closed")
		end
		-- we also need remove all tux skills, except use weapon
		Tux:downgrade_program("Hacking")
		Tux:downgrade_program("Repair equipment")
		Tux:downgrade_program("Emergency shutdown")
		-- done initializing
		Npc:set_name("Tutorial Tom")
		display_console_message(string.format(_"Met [b]%s[/b]!", Npc:get_translated_name()))
	end,

	EveryTime = function()
		if (TutorialTom_start_chat) then --initiated by TutorialTerminal.dialog
			Npc:says(_"Well done.")
			Npc:says(_"Now follow me to the next section. You will learn how to hack bots.")
			TutorialTom_start_chat = false -- don't show this again
			Npc:teleport("TutorialTomPostTerminalTeleportTarget")
			Npc:set_destination("TutorialTom-Takeover")
			change_obstacle_state("TutorialTakeover", "opened") --door
			end_dialog()
		end

		if (partner_started()) and
		   (TutorialTom_glasswall_smashed) and
		   (cmp_obstacle_state("TutorialWall", "broken")) and
		   (not TutorialTom_glasswall_done) then
			-- wall section, shown if tux destroyed the wall by hand
			Npc:says(_"Great, you figured out how deal with this obstacle.")
			Npc:says(_"Let's proceed.")
			TutorialTom_glasswall_done = true
			if (not TutorialTom_Tux_PastWall) then
				TutorialTom_Tux_PastWall = true
				Npc:set_destination("TutorialTom-Ranged")
			end
			end_dialog()
		end

		if (not cmp_obstacle_state("TutorialWall", "broken")) then
			--to avoid regressions with code above
			if (partner_started()) then
				Npc:says(_"Hi Linarian, I've been expecting you. My name is Tutorial Tom.")
				Npc:says(_"Long stasis sleep unfortunately has the side effect of temporary memory loss, sometimes even for simple ordinary every day things.")
				Npc:says(_"So let's start with the basics, shall we?")
				show("node1", "node7", "node80")
				Npc:set_rush_tux(false)
			elseif (Tux:has_quest("Tutorial Movement")) and
				   (not TutorialTom_talk_to_tom_EveryTime) then
				-- only once
				TutorialTom_talk_to_tom_EveryTime = true
				Npc:says(_"Glad to see you figured out the quest log!")
			elseif (Tux:has_quest("Tutorial Movement")) and
			       (TutorialTom_move_black) and
			       (not TutorialTom_sprinting) then
				TutorialTom_sprinting = true
				Npc:says(_"Speaking of moment, you can also [b]sprint[/b] by holding the [b]control key[/b].")
				Tux:update_quest("Tutorial Movement", _"Apparently I can sprint if I hold down the control key as I move. This might help if I get in a tight spot.")
				Npc:says(_"This distance is determined by your yellow stamina bar; the more you have, the farther you can run without becoming winded.")
			end
		end

		if (tut_tux_items_entered) and
		   (not TutorialTom_Tux_found_all_items) then
			show("node5")
		end

		if (not tut_tux_melee_entered ) then

			if (tut_tux_chest_entered) and
			   (not tut_item_chest_opened) then
				show("node10")
			elseif (tut_item_chest_opened) then
				hide("node10")
				show("node11")
			end

			if (Tux:has_item("Normal Jacket")) or
			   (Tux:has_item("Improvised Buckler")) or
			   (Tux:has_item("Shoes")) or
			   (Tux:has_item("Worker Helmet")) then
				hide("node11")
				Npc:says(_"Excellent, I see you already took on the armor that was in the box.")
				if (not armor_node_one) then
					show("node12")
				end
				if (not armor_node_two) then
					show("node13")
				end
			end
		end

		if (tut_tux_melee_entered) and
		   (not tut_tux_glass_entered) then
			-- tux is still in bot melee area
			show("node24")
		end

		if (tut_tux_terminal_entered) then
			hide("node24")
		end

		if (cmp_obstacle_state("TutorialDoor", "opened")) and
		   (tut_tux_takeover_entered) and
		   (not TutorialTom_node50_done) then
			show("node50")
		end

		if (tut_tux_glass_entered) then
			show("node70")
		end

		if (TutorialTom_Tux_PastWall) then
			hide("node70") show("node30")
		end

		if (Tux:done_quest("Tutorial Hacking")) and
		   (not tut_tux_glass_entered) and
		   (not TutorialTom_hide_71) then
			show("node71")
		else
			hide("node71")
		end

		if (tut_tux_glass_entered) then
			hide("node55", "node57")
		end

		if (tut_tux_ranged_entered) and
		   (not tux_node38_done) then
			show("node38")
		end

		if (Tux:has_quest("Tutorial Shooting")) then
			hide("node30") --avoid assigning the quest twice etc..
		end

		show("node99")
	end,

	{
		id = "node1",
		text = _"Yes, it would be most kind of you. I don't remember anything.",
		code = function()
			Npc:says(_"You Linarians keep a quest [b]Log[/b] where you write down key bits of information.")
			Npc:says(_"When you aren't speaking with someone, you can open it up or close it by pressing the [b]q key[/b].")
			Npc:says(_"I'll assign you a new quest, so you can try it out. Once you are done, [b]left click[/b] on me.")
			if (not Tux:has_quest("Tutorial Movement")) then
				Tux:add_quest("Tutorial Movement", _"To talk to someone, left click on them. You can talk to any friendly bot or person. Friendly people and bots have a green bar above them. Press the 'q' key to open or close the quest log. Left click back on Tutorial Tom to learn more!")
			end
			display_big_message(_"Press 'q' for Quests!")
			hide("node1", "node7", "node80") show("node2", "node3", "node4", "node8")
			if (tut_tux_items_entered) and
			   (not TutorialTom_Tux_found_all_items) then
				show("node5")
			end
			end_dialog()
		end,
	},
	{
		id = "node2",
		text = _"What can you tell me about finding my way in the world?",
		code = function()
			Npc:says(_"You Linarians see the world similar to the Heads Up Displays, or [b]HUD[/b], used in computer games.")
			Npc:says(_"Linarians, like all birds, have a remarkable internal sense of direction. Apparently your HUD has a [b]compass[/b], represented by four red arrows in the upper right corner with North marked on it.")
			Npc:says(_"You can temporarily disable this compass by pressing the 'tab' key.")
			Tux:update_quest("Tutorial Movement", _"I learned the four red arrows in the upper-right of my HUD is a compass with north marked on it. I can toggle it using the 'tab' key.")
			Npc:says(_"Rumor is there was a device Linarians used to remember every place they had been, called an [b]automap[/b].")
			Npc:says(_"Although, you don't currently have such a device, you might find someone with nanotechnology skills to make one.")
			Tux:says(_"I'll keep that in mind.")
			hide("node2")
		end,
	},
	{
		id = "node3",
		text = _"My limbs don't seem to want to work properly. Can you help me with that?",
		code = function()
			Npc:says(_"Ah yes, movement. It's second nature to us humans, but our research with you in the past showed that your brain seems to work more like a computer.")
			Npc:says(_"To move somewhere, you have to [b]left click[/b] on the destination on your HUD.")
			Npc:says(_"If you can go there, you will do so.")
			Npc:says(_"Now try to move to the red dot to the north. Then to the black grating to the east, and then talk to me again.")
			Tux:update_quest("Tutorial Movement", _"I'm supposed to left click anywhere to move to a location. If I can figure out a way, I will move there automatically. Tom wants me to first try to move to the red dot to the North.")
			TutorialTom_learn_to_walk = true
			hide("node3")
			end_dialog()
		end,
	},
	{
		id = "node4",
		text = _"What else makes me different as a Linarian?",
		code = function()
			Npc:says(_"As a Linarian, you have some special abilities that no human does: Linarians can translate programming source code into something like magic.")
			Npc:says(_"However, using these [b]Programs[/b], adversely affect your body temperature, which you must regulate.")
			Npc:says(_"But you normally have a special program called [b]Emergency Shutdown[/b], which freezes your motions for several seconds but significantly cools your body.")
			Npc:says(_"This, and the ability to hack bots will soon return once your mind recovers from the stasis.")
			Npc:says(_"Once it does, we'll talk more about programs. You can toggle the [b]Skills/Program menu[/b] by pressing the [b]s key[/b].")
			Tux:update_quest("Tutorial Movement", _"View the Skills/Program menu by pressing the 's' key.")
			hide("node4")
		end,
	},
	{
		id = "node5",
		text = _"I'm sensing some sort of strange presence in the vicinity.",
		code = function()
			Npc:says(_"Ah, yes.", "NO_WAIT")
			Npc:says(_"Linarians seem to [b]detect items[/b] - even through walls - in an augmented reality.")
			Npc:says(_"The [b]z key[/b] will toggle this augmentation, while the [b]x key[/b] momentarily flashes it.")
			Npc:says(_"Moving your pointer over an item will tell you more about that item.")
			Npc:says(_"On our way to the next stopping point, we'll pass some items on the floor.")
			Npc:says(_"Feel free to stop and examine them to get practice.")
			Npc:says(_"[b]Left clicking[/b] on an item will pick it up and put it in your inventory, toggled by the [b]i key[/b], where you can examine it further.")
			if (not TutorialTom_TutMovement_ToggleDetectItems) and
			    Tux:has_quest("Tutorial Movement") then
				Tux:update_quest("Tutorial Movement", _"Toggle detect items by pressing the 'z' key, and press 'x' to flash the ability. To pick up an item, left click on it. To view an item you've picked up, open the inventory by pressing 'i'.")
				TutorialTom_TutMovement_ToggleDetectItems = true
			end
			if (Tux:has_item("Mug")) and
			   (Tux:has_item("Anti-grav Pod for Droids")) and
			   (Tux:has_item("Plasma Transistor")) then
				-- these are the items in the room item
				Npc:says(_"Oh great, I see you found all the items hidden in the room. Good job!")
				TutorialTom_Tux_found_all_items = true
			end
			hide("node5")
		end,
	},
	{
		id = "node7",
		text = _"No, thanks, I still remember how to walk, run, navigate, and pick things up.",
		code = function()
			hide("node1", "node7", "node80") next("node9")
		end,
	},
	{
		id = "node8",
		text = _"Thank you, that was very informative. I think I got how to move around. Can we proceed now?",
		code = function()
			Tux:end_quest("Tutorial Movement")
			Npc:says(_"I just closed your first quest. You can still see what you learned by clicking on the 'done quests' tab in the quest screen.", "NO_WAIT")
			hide("node8") next("node9")
		end,
	},
	{
		id = "node9",
		text = _"I'm eager to learn more.",
		code = function()
			Npc:says(_"Ok, follow me into the next area.")
			for var in ipairs(TutorialTom_doors) do
				change_obstacle_state(TutorialTom_doors[var], "opened")
			end
			hide("node1", "node2", "node3", "node4", "node5")
			end_dialog()
		end,
	},
	{
		id = "node10",
		text = _"What is in that chest?",
		code = function()
			Npc:says(_"Well, you can interact with several types of objects by simply [b]left clicking[/b] on them.")
			Npc:says(_"Left click on the chest to open it up and see what is inside.")
			if (not Tux:has_quest("Tutorial Melee")) then
				Tux:add_quest("Tutorial Melee", _"I'm supposed to left click on chests to open them up.")
			end
			hide("node10") show("node19")
			end_dialog()
		end,
	},
	{
		id = "node11",
		text = _"Some items came out.",
		code = function()
			Npc:says(_"Well, you've discovered a great secret: chests sometimes contain items.")
			Npc:says(_"We humans have a fascination with hiding our treasures. What comprises a treasure means different things to different people.")
			Npc:says(_"For some, it's valuable metals in robotic circuitry. That's the current monetary standard on our world.")
			Npc:says(_"For others, it may be weapons, or even just items that may be used as weapons in a pinch.")
			Npc:says(_"Still others, odd as it may sound, keep dishes hidden away.")
			Npc:says(_"Perhaps the best thing you can find, though, is armor. At least, given the current situation with the bots, that is.")
			hide("node11") show("node12", "node13")
		end,
	},
	{
		-- armor_node_one
		id = "node12",
		text = _"Armor? I should know more about this.",
		code = function()
			Npc:says(_"In the years since you entered stasis, mankind has done much research in the field of robotics.")
			Npc:says(_"One branch in particular that has served us well is the realm of nanotechnology.")
			Npc:says(_"Because they run a very simple operating system, nanobots were not affected by whatever caused the Great Assault.")
			Npc:says(_"To this day, our armor and clothing are made out of nanobots. This enables many different sizes of people to wear the same clothing.")
			Npc:says(_"The nanobots reshape the garment for a comfortable fit, so even you should be able to wear them without problem.")
			hide("node12") show("node14")
		end,
	},
	{
		-- armor_node_two
		id = "node13",
		text = _"How does wearing clothes and holding shields help me?",
		code = function()
			Npc:says(_"Well, it can help you avoid indecent exposure charges.")
			Tux:says(_"...")
			Npc:says(_"But all jokes aside, the bots will not mess around.")
			Npc:says(_"Even the best of fighters sometimes get hit by enemy blows. If I were you, I would seriously consider wearing some sort of armor before mixing it up with those bots.")
			Npc:says(_"They will help to mitigate some of the damage you take from melee or ranged combat.")
			Npc:says(_"Keep in mind, though, that there is a chance that your armor will take damage whenever you get hit. Keep an eye on it, or you'll lose it.")
			hide("node13") show("node15")
		end,
	},
	{
		id = "node14",
		text = _"That sounds useful. How do I use armor?",
		code = function()
			Npc:says(_"Well, let me start by saying that there are four classes of armor: headgear, shoes, body armor, and shields.")
			Npc:says(_"When you pick up a piece of armor of a particular class, and you don't already have one equipped, you will automatically equip it if you can.")
			Npc:says(_"Picking up armor and items can be accomplished by [b]left clicking[/b] on the item. If your inventory has space, you will pick the item up.")
			Npc:says(_"If you currently have one piece of armor equipped that you would like to swap out for another, simply drag the new armor piece to the current armor piece and left click.")
			Npc:says(_"They will swap places, and you can put the other piece of armor back into your inventory.")
			Npc:says(_"Alternatively, you can drag it into your field of view and drop it on the ground.")
			hide("node14") show("node16")
		end,
	},
	{
		id = "node15",
		text = _"I wouldn't want to lose any armor. What can I do about that?",
		code = function()
			Npc:says(_"Well, there are several ways to keep that from happening.")
			Npc:says(_"Equipped items in poor condition will show up yellow and should turn red if in critical condition.")
			Npc:says(_"If you don't unequip an item in poor or critical condition it may be ruined!")
			Npc:says(_"There are three things you can do when an item reaches critical condition:")
			Npc:says(_"First, you can sell or discard the item.")
			Npc:says(_"Second, you can use your [b]repair equipment[/b] program on the item, which will repair the item at the cost of some of its durability.")
			Npc:says(_"Or third, you can have the item repaired at a shop, which maintains the item's durability at a price.")
			hide("node15") show("node17", "node61")
		end,
	},
	{
		id = "node16",
		text = _"You mentioned discarding an item. Why would I want to do that?",
		code = function()
			Npc:says(_"Well, I can think of a few reasons.")
			Npc:says(_"You might not have enough room in your inventory for an item you need more, or can sell for more.")
			Npc:says(_"If an item is close to being destroyed, you might also consider dropping it.")
			Npc:says(_"And finally some items give negative status effects, and aren't worth selling.")
			Npc:says(_"Armor or weapons may affect you in different ways.")
			Npc:says(_"Some will help you out, for example by increasing your cooling rate or increasing your dexterity. This is the work of specialized nanobots, but the reverse can happen too.")
			hide("node16")
			armor_node_two = true
			if (armor_node_one) then
				show("node19")
			end
		end,
	},
	{
		id = "node17",
		text = _"Repair equipment program? How do I use that?",
		code = function()
			Npc:says(_"Perhaps I should start by explaining programs in general.")
			Npc:says(_"To use a program, select it through your HUD (remember the [b]s key[/b] toggles your [b]Skills/Program menu[/b]).")
			Npc:says(_"After you've selected a program, run the program by right clicking. Depending on the program you can target an enemy, an item, or just the world.")
			Npc:says(_"You can also assign quick-select keys to programs. Simply hover over the program in the Skills/Program menu and press one of the keys [b]F5[/b] to [b]F12[/b]. Then, whenever you press this button, you will select the corresponding program.")
			Npc:says(_"If you're curious what a program does, you can find out by clicking the question mark in the Skills/Program menu.")
			Npc:says(_"Now, to answer your question, you use your repair equipment program by selecting it in the Skills/Program menu, then right clicking on the item you wish to repair.")
			Tux:improve_program("Repair equipment")
			TutorialTom_has_repair = true
			if (not Tux:has_quest("Tutorial Melee")) then -- this might be tricky
				Tux:add_quest("Tutorial Melee", _"Run a program by right clicking after it has been selected from the Skills/Program menu. My shoes are damaged, so I might try the repair equipment program on them to slightly repair them.")
			else
				Tux:update_quest("Tutorial Melee", _"Run a program by right clicking after it has been selected from the Skills/Program menu. My shoes are damaged, so I might try the repair equipment program on them to slightly repair them.")
			end
			hide("node17")
		end,
	},
	{
		id = "node19",
		text = _"I think I'm ready for the next section of the tutorial.",
		code = function()
			Npc:says(_"Ok, I'll open the next door then. But prepare yourself, soon you will learn how to fight against bots in hand-to-hand combat.")
			if (not TutorialTom_has_repair) then
				Tux:improve_program("Repair equipment")
			end
			change_obstacle_state("TutorialEquipOut", "opened")
			end_dialog()
			hide("node10", "node11", "node12", "node13", "node14", "node15", "node16", "node17", "node61", "node62", "node63", "node64", "node65", "node19") show("node20")
		end,
	},
	{
		id = "node20",
		text = _"Can you tell me how to fight the bots?",
		code = function()
			Npc:says(_"I will certainly try my best.")
			Npc:says(_"It's odd to think that a flightless bird would be such a scrapper, but you Linarians have been surprising us since the beginning.")
			Npc:says(_"We prefer to fight the blamed droids at a distance. They're less likely to rend us limb from limb that way.")
			Npc:says(_"Unfortunately, guns and other ranged weaponry are hard to come by these days.")
			Npc:says(_"That goes double for ammunition. Because these are bots, you really can't effectively keep them at bay by just waving around an empty gun.")
			Npc:says(_"With that in mind, your most reliable weapons are your fists. They never run out of ammo or wear down, but of course they don't do much damage against a metal body, either.")
			hide("node20") show("node21", "node23")
		end,
	},
	{
		id = "node21",
		text = _"So I'm supposed to fight bots with my fists?",
		code = function()
			Npc:says(_"There may be times when you have no choice.")
			Npc:says(_"Melee combat, armed or unarmed, can be initiated by [b]left clicking[/b] on an enemy.")
			Npc:says(_"You will then walk over to the enemy and start hitting them.")
			Npc:says(_"Now, I understand you may have some concerns over your safety during this...")
			Tux:says(_"CONCERNS? Erm... Yes, this doesn't sound like a particularly healthy endeavor.")
			Npc:says(_"Fred, if you're afraid, you'll have to overlook it. Besides, you knew the job was dangerous when you took it.")
			Tux:says(_"I beg your pardon? Who is Fred?")
			Npc:says(_"Never mind, just an old song.")
			Npc:says(_"Fighting the bots hand-to-hand has risks, there is no question. However, there are things you can do to even the odds.")
			Npc:says(_"We already discussed armor. Another useful type of item is medical supplies.")
			Npc:says(_"There are a few different types of restorative items. The most common are health drinks.")
			hide("node21") show("node22")
		end,
	},
	{
		id = "node22",
		text = _"Tell me about health drinks.",
		code = function()
			Npc:says(_"Man has practised medicine in one form or another for hundreds of years.")
			Npc:says(_"Using some of the same nanotechnology that makes up your armor, we've perfected drinks that instantaneously restore your health.")
			Npc:says(_"There are many kinds, but all accomplish the same thing, to varying degrees.")
			Npc:says(_"Certain items, like health drinks, can be used directly without clicking on them.")
			Npc:says(_"At the bottom of your HUD, you'll notice your item access belt. Small items can go here and be used by pressing the numbers [b]0[/b] through [b]9[/b].")
			Npc:says(_"Unlike armor or weapons, multiple of these items will group together in your inventory slots.")
			Npc:says(_"If you have Diet Supplements equipped in item slot 1, you can press 1 to use one.")
			Npc:says(_"This will restore your health, and will be invaluable in the heat of battle.")
			Tux:update_quest("Tutorial Melee", _"Small one-time-use items, like diet supplements, can be placed in inventory spots labels 1 to 0, and can be used by pressing the corresponding key.")
			hide("node22")
		end,
	},
	{
		id = "node23",
		text = _"I'm ready to fight my first bot.",
		code = function()
			Npc:says(_"We keep two bots captive for melee practice.")
			Npc:says(_"I've unlocked the door leading to the first bot. Take care of it, then come back and talk to me.")
			Npc:says(_"I'm also giving you some health drinks. Feel free to use them, though I can heal you if you need it.")
			Npc:says(_"Your health will also regenerate over time. I wish it were so easy for us humans.")
			Npc:says(_"The first bot is carrying an [b]Entropy Inverter[/b]. Bring it to me to prove you've beaten it.")
			Npc:says(_"Come back and talk to me when you have the Entropy Inverter.")
			change_obstacle_state("TutorialMelee1", "opened")
			Tux:add_item("Doc-in-a-can", 3)
			Tux:update_quest("Tutorial Melee", _"I'm going to fight my first bot! To start melee combat left click on the bot. Tom wants the Entropy Inverter from the bot after I've defeated it, so I should pick that up.")
			hide("node23") show("node24", "node25")
			end_dialog()
		end,
	},
	{
		id = "node24",
		text = _"Can you heal me?",
		code = function()
			if (Tux:get_hp_ratio() == 1) then
				Npc:says(_"You are fine, there is nothing that I can do.")
				hide("node24")
			else
				Npc:says(_"You should be more careful, Linarian. But yes, I can heal you.")
				Npc:says(_"There, all better.")
				Tux:heal()
			end
		end,
	},
	{
		id = "node25",
		text = _"I've beaten the first bot.",
		code = function()
			if (Tux:has_item_backpack("Entropy Inverter")) then
				Npc:says(_"So you have. Well done.")
				Npc:says(_"I'll exchange this wrench for it. I think you'll find it handy.")
				Npc:says(_"Now would be an appropriate time to mention bot parts, I guess.")
				Npc:says(_"Certain parts in the bots are extra valuable. You can sell them at stores for cash.")
				Npc:says(_"If you can learn to extract these parts, it can help improve your lot in the world.")
				Npc:says(_"Hopefully, you can find someone to teach you.")
				Tux:del_item_backpack("Entropy Inverter", 1)
				Tux:add_item("Big wrench", 1)
				Tux:update_quest("Tutorial Melee", _"I brought the entropy inverter to Tom and he gave me my first weapon: a Big wrench. I should equip it.")
				hide("node25") show("node26")
			else
				Npc:says(_"Trying to cheat your way through the tutorial doesn't bode well for your chances in the real world.")
				Npc:says(_"I'll need proof that you've beaten the first bot.")
				Npc:says(_"Don't come back without the [b]Entropy Inverter[/b] it was carrying.")
				end_dialog()
			end
		end,
	},
	{
		id = "node26",
		text = _"You mentioned another bot?",
		code = function()
			Npc:says(_"That's correct. The second bot is a lot more dangerous, and you're not likely to make much headway against it with your fists.")
			Npc:says(_"Lucky for you, there's another dimension to melee combat.")
			Npc:says(_"Fighting bots with your fists is fine, but there are a number of items you can use for melee.")
			Npc:says(_"There are several traditional weapons in the world such as swords or light sabers that can be used against the bots.")
			Npc:says(_"However, more common items you encounter every day can often be used to bash or pry at droid armor.")
			Npc:says(_"For example, that wrench I just gave you will increase the damage you do, and should let you best the next bot.")
			hide("node26") show("node27")
		end,
	},
	{
		id = "node27",
		text = _"I'm ready to take the next bot on.",
		code = function()
			Npc:says(_"I certainly hope so. I will heal you before you go to the next room.")
			Npc:says(_"I'm also giving you another healing drink, just in case.")
			Npc:says(_"A 247 is nothing to trifle with, so I'm giving you a shield in the hopes that it'll help keep you alive.")
			Npc:says(_"Finally, I'm giving you couple of somewhat experimental pills that will temporarily increase your strength and dexterity, respectively.")
			Npc:says(_"Use them in the same way you would use a health drink.")
			Npc:says(_"If I were you, I would think about using your repair equipment program on your armor and that wrench before you go into the room.")
			Npc:says(_"You'll also need to equip them. I won't do that for you.")
			Npc:says(_"Like the last bot, this one will be carrying an item. Bring me the [b]Tachyon Condensator[/b] it is carrying to continue.")
			Npc:says(_"I've unlocked the door. Good luck, and talk to me when you have the Tachyon Condensator.")
			change_obstacle_state("TutorialMelee2", "opened")
			Tux:heal()
			Tux:add_item("Doc-in-a-can", 1)
			Tux:add_item("Strength Capsule", 1)
			Tux:add_item("Dexterity Capsule", 1)
			Tux:add_item("Standard Shield", 1)
			hide("node27") show("node28")
			end_dialog()
		end,
	},
	{
		id = "node28",
		text = _"I've beaten the second bot.",
		code = function()
			if (Tux:has_item_backpack("Tachyon Condensator")) then
				Npc:says(_"Very good! You've completed your melee training.")
				Npc:says(_"These skills will serve you well in the future.")
				Npc:says(_"Talk to me when you're ready to move on to the next part of the tutorial.")
				Tux:del_item_backpack("Tachyon Condensator", 1)
				hide("node28") show("node29")
			else
				Npc:says(_"You didn't bring back the Tachyon Condensator. You'll need to bring it back before we can continue.")
				Npc:says(_"I'll go ahead and heal you. If your weapon or armor are in bad shape, perhaps you should repair them before going back in there.")
				Npc:says(_"Don't come back without the [b]Tachyon Condensator[/b].")
				end_dialog()
			end
			Tux:heal()
		end,
	},
	{
		id = "node29",
		text = _"I'm ready to move on.",
		code = function()
			if (not Tux:done_quest("Tutorial Melee")) then
				Tux:end_quest("Tutorial Melee", _"I decided to move on and go to next unit of the tutorial.")
			end
			--[[ if (TutorialTom_has_gun) then
			Npc:says(_"I'll bet you're itching to try that pistol out on some bots.")
			Npc:says(_"Our next destination is the ranged combat training area, so you're in luck.")
			end ]]--
			Npc:says(_"I'll unlock the door to the south. Follow the corridor east.")
			change_obstacle_state("TutorialMeleeOut", "opened")
			Npc:set_destination("TutorialTom-Terminal")
			hide("node20", "node21", "node22", "node23", "node24", "node25", "node26", "node27", "node28", "node29")
			show("node40")
			end_dialog()
		end,
	},
	{
		id = "node30",
		text = _"Ranged weaponry seems safer than getting up close and personal.",
		code = function()
			Npc:says(_"Well, Linarian, most of the time it is.")
			Npc:says(_"There are some bots with ranged weaponry, but we don't have any of those in captivity.")
			Tux:add_quest("Tutorial Shooting", _"I am learning about how to use ranged weapons.")
			hide("node30") show("node31", "node38")
		end,
	},
	{
		id = "node31",
		text = _"So what can you tell me about guns?",
		code = function()
			Npc:says(_"The basic idea behind ranged weaponry is to hurt or kill an enemy without having to come within swinging range.")
			Npc:says(_"There are three basic ways to do this: traditional firearms, lasers, and plasma weapons.")
			Npc:says(_"Traditional firearms are things that go bang. A small explosion accelerates the ammunition towards the target at a high velocity, causing injury.")
			Npc:says(_"Lasers use an intensified beam of light to burn through the intended victim. These operate on replaceable charge packs.")
			Npc:says(_"Plasma weapons use superheated ionized gas to burn the target. The gas comes in loadable canisters.")
			Npc:says(_"Most other ranged weapons are variations of these three. We have a few in storage for training purposes.")
			hide("node31") show("node32")
		end,
	},
	{
		id = "node32",
		text = _"So how do I use guns?",
		code = function()
			Npc:says(_"Well, firing is pretty simple. First, equip a ranged weapon that you have ammunition for.")
			Npc:says(_"Next, simply [b]left click[/b] on your target, and you'll begin firing.")
			Npc:says(_"Alternatively, you can fire a single shot using the [b]Fire Weapon[/b] program, and [b]right clicking[/b] on the enemy.", "NO_WAIT")
			Npc:says(_"That is the best way if you are trying to conserve precious ammo with high rate of fire guns.")
			Npc:says(_"There are a couple of new tricks with ranged weapons. If you want to [b]move while firing[/b]: hold [b]shift[/b] and [b]left click[/b] your desired position.")
			Npc:says(_"If you'd rather stay in place: Hold [b]A[/b], then [b]left click[/b] your target.")
			Npc:says(_"When your weapon runs out of ammo during combat, it will try to automatically reload if you have extra ammunition for it.")
			Npc:says(_"Sometimes, you will need or want to manually reload. You can do this by pressing the [b]r key[/b].")
			Npc:says(_"If you are reloading, or you are out of ammo, the small message screen at the bottom of your HUD will tell you what type of ammo to get.")
			if (not TutorialTom_guns_how_to) then
				TutorialTom_guns_how_to = true
				Tux:update_quest("Tutorial Shooting", _"If I have equipped a ranged weapon and I left click on an enemy, I will begin firing upon it until my gun is empty, and automatically reload. But if I want to fire a single shot, I need to also equip the Fire Weapon program, and then right click. To move while firing, I have to shift + left click to where I want to go. Also, if I want to manually reload I have to press the 'r' key. The small message screen at the bottom of my HUD will tell me if I'm reloading or out of ammunition.")
			end
			if (not TutorialTom_opened_door) then
				show("node33")
			end
			hide("node32")
		end,
	},
	{
		id = "node33",
		text = _"I think I understand how to use guns now.",
		code = function()
			Npc:says(_"In that case, I'll let you in to the armory. There are some crates and chests in there with weapons and ammunition.")
			Npc:says(_"Be careful though, smashing open crates and barrels could hurt you.")
			if (TutorialTom_has_gun) then
				Npc:says(_"You already got the .22 pistol I gave you earlier? It's not much as guns go, but it can do the trick.")
			else
				Npc:says(_"Here's my personal .22 Automatic pistol. It's not much as guns go, but it can do the trick.")
				Tux:add_item(".22 Automatic", 1)
				Tux:add_item(".22 LR Ammunition", 10)
			end
			Npc:says(_"Here is some more ammunition for it.")
			Npc:says(_"You'll no doubt get more mileage out of the plasma pistol, though. Or any other gun, for that matter.")
			Npc:says(_"Practice switching weapons and reloading.")
			Npc:says(_"On the other side of that fence are some bots. Practice killing them off with various ranged weapons.")
			Npc:says(_"Once you've gotten rid of them all, we can move on.")
			Tux:update_quest("Tutorial Shooting", _"Tutorial Tom wants me to shoot those bots.")
			-- TODO probably explain leveling as well as balancing changes to XP always risk causing leveling here. Or somehow make sure Tux can't level
			TutorialTom_opened_door = true
			change_obstacle_state("TutorialStorage", "opened")
			change_obstacle_state("TutorialShootCage", "opened")
			Tux:add_item(".22 LR Ammunition", 50)
			hide("node33") show("node34", "node35")
			end_dialog()
		end,
	},
	{
		id = "node34",
		text = _"I ran out of ammo. Can I have some more?",
		code = function()
			if (cmp_obstacle_state("37-ammo-chest", "unlocked")) then -- check if tux has opened the ammo chest already : yes
				if (Tux:has_item_backpack("Laser power pack")) or (Tux:has_item_backpack("Plasma energy container")) or (Tux:has_item_backpack(".22 LR Ammunition")) then
					-- check if tux still has ammo left
					Npc:says(_"Looks like you still have some ammo left in your inventory...")
					Npc:says(_"Why don't you use this first?")
					Npc:says(_"Try to switch to another gun maybe...")
				else -- chest opened but no ammo left in inventory...
					Npc:says(_"Ok, I will give you some more ammo. You seem to be in need, indeed...")
					Tux:add_item("Laser power pack", 10)
					Tux:add_item("Plasma energy container", 10)
					Tux:add_item(".22 LR Ammunition", 10)
				end
			else
				Npc:says(_"Check the storage room to the west for more guns and ammo.")
			end
		end,
	},
	{
		id = "node35",
		text = _"I killed all the bots.",
		code = function()
			if (Tux:done_quest("Tutorial Shooting")) then
				Npc:says(_"Excellent job.")
				Npc:says(_"Keep shooting like that, and the bots will never stand a chance, as long as you still have ammo.")
				Tux:update_quest("Tutorial Shooting", _"That was like shooting fish in a barrel. I could use a fish about now.")
				hide("node35") show("node36", "node37")
				end_dialog()
			else
				Npc:says(_"I don't mind if you don't want to do this, but please don't try to trick me.")
				Npc:says(_"I don't have verified kills on all those bots.")
			end
		end,
	},
	{
		id = "node36",
		text = _"I would like a few more bots to shoot at.",
		code = function()
			Npc:says(_"Ok, I'll create some more droids.")
			i = 1
			while (i < 8) do
				create_droid("shootingrange"..i, 123)
				i = i + 2
			end
			hide("node36")
			end_dialog()
		end,
	},
	{
		id = "node37",
		text = _"So, what's next?",
		code = function()
			Npc:says(_"Now, there's one last thing you should know.")
			Npc:says(_"You Linarians can apparently withdraw from our world temporarily.")
			Npc:says(_"Time stops, and everything freezes in place.")
			Npc:says(_"This can be accomplished by using the [b]Esc key[/b].")
			if (not TutorialTom_hacking_bots) then
				Npc:says(_"Your final task is to leave us using this menu.")
				Npc:says(_"I'm afraid there's nothing more I can teach you. I wish you good luck, Linarian.")
				Npc:says(_"You'll need it if our world is to survive.")
			end
			change_obstacle_state("TutorialExit1", "opened")
			hide("node30", "node31", "node32", "node33", "node34", "node35", "node36", "node38")
		end,
	},
	{
		id = "node38",
		text = _"Why can't I hack the bots here, or use programs on them?",
		code = function()
			Npc:says(_"Well, that would be cheating, don't you think so?")
			Npc:says(_"Shooting moving targets needs a bit of practice, yes...")
			Npc:says(_"...but in the end you will profit a lot from it.")
			Tux:says(_"Ok, I will try my best.")
			tux_node38_done = true
			hide("node38")
		end,
	},
	{
		id = "node40",
		text = _"Why are we stopping?",
		code = function()
			Npc:says(_"You've done well so far, Linarian. Let's take a little break.")
			Npc:says(_"Once you get out into the real world, you'll find that your current abilities aren't always enough to survive.")
			Npc:says(_"As you achieve combat experience, you'll be able to apply it to better yourself.")
			Npc:says(_"As with most things, you view this as a panel in your HUD. Press the [b]c key[/b] to open the [b]Character panel[/b].")
			Npc:says(_"Once you've gained enough experience, you'll level up. This will automatically improve some of your statistics.")
			Npc:says(_"You'll also be given 5 points to spend however you choose in three different areas. Characteristics, Skills and Programs.")
			Npc:says(_"[b]Strength[/b] governs the amount of damage you do with each hit in melee combat.")
			Npc:says(_"[b]Dexterity[/b] controls your hit rate, or how likely you are to hit the enemy. It also determines how likely you are to dodge a hit from them.")
			Npc:says(_"[b]Cooling[/b] is your processors cooling, or heat resilience, and determines how much you can process before your system starts overheating.")
			Npc:says(_"Finally, among your main characteristics, [b]Physique[/b] determines how much health you have.")
			Npc:says(_"There are general [b]Melee[/b] and [b]Ranged[/b] fighting skills, both of which increase the damage you inflict and how fast you attack as you improve them.")
			Npc:says(_"You also have the [b]Programming[/b] skill, which essentially is about programming in an energy-efficient manner so programs cause less heat.")
			Npc:says(_"Apart from this, a few programs require a teacher and training points to improve.")
			Npc:says(_"[b]Extract Bot Parts[/b] is a special passive skill that will allow you to salvage parts from bots you 'retire', which you can trade for money in the town.")
			Npc:says(_"A good technician is able to make use of those parts.")
			Npc:says(_"He can create, let's say, an add-on and, after doing some modifications to the item, attach this add-on.")
			Npc:says(_"This way an upgraded item is created.")
			Tux:add_quest("Tutorial Upgrading Items", _"There is a way to upgrade items if I meet a good technician. It sounds useful, maybe I should learn more about this.")
			Npc:says(_"The [b]Hacking[/b] program we will speak a bit more of in a little while.")
			hide("node40") show("node41")
		end,
	},
	{
		id = "node41",
		text = _"I'll have to keep that in mind.",
		code = function()
			Npc:says(_"Well, how about you try it out?")
			Npc:says(_"I'll give you some points to spend, and you can distribute them as you like.")
			Npc:says(_"Since you'll be hacking up ahead, you should probably use a few of them on [b]Cooling[/b].")
			Npc:says(_"But, again, that's your choice.")
			Tux:add_xp(2000)
			hide("node41") show("node58")
			end_dialog()
		end,
	},
	{
		id = "node42",
		text = _"Alright, I'm ready to go hack some bots.",
		code = function()
			if (not Tux:done_quest("Tutorial Upgrading Items")) then
				Tux:end_quest("Tutorial Upgrading Items", _"I decided that I don't need to know how to upgrade items.")
			end
			Npc:says(_"First, you'll need to unlock the door.")
			Npc:says(_"See that [b]Terminal[/b] to the left?")
			Npc:says(_"You will need to login, by left clicking on it, and then select unlock door.")
			Npc:says(_"Terminals act very similar to hacked bots.")
			Tux:add_quest("Tutorial Hacking", _"I need to login to the Terminal by left clicking on it. Then I'll unlock the door, so I can go hack some bots!")
			hide("node42", "node58", "node59", "node60")
			end_dialog()
		end,
	},
	{
		id = "node50",
		text = _"So how does this work?",
		code = function()
			Npc:says(_"We talked about programs before. Now, we're going to focus on hacking programs in particular.")
			Npc:says(_"As I mentioned before, your brain works in a way remarkably similar to a central processing unit.")
			Npc:says(_"In many ways, you interact with the world around you as a virtual environment.")
			Npc:says(_"You seem to have access to an API that isn't exposed to humans. You can interact with the environment in ways we only dream of.")
			Npc:says(_"Because of this, you can run various programs on the bots.")
			Npc:says(_"You can attempt to take them over, or monkey with their programming, or even cause them to damage themselves.")
			Npc:says(_"Likewise, there are certain programs that affect you or items around you.")
			if (not Tux:has_quest("Tutorial Hacking")) then -- quest already added in node 42
				Tux:add_quest("Tutorial Hacking", _"I need to login to the Terminal by left clicking on it. Then I'll unlock the door, so I can go hack some bots!")
			end
			TutorialTom_node50_done = true
			hide("node50") show("node51")
		end,
	},
	{
		id = "node51",
		text = _"Tell me about taking bots over.",
		code = function()
			Npc:says(_"I'm afraid that you will have to experience it for yourself to really understand.")
		--	Npc:says(_"However, you did leave yourself instructions before you went into stasis sleep.")
			Npc:says(_"Taking over a bot comes in the form of a game or competition placing you against the bot.")
			Npc:says(_"You initiate it by selecting the [b]Hacking[/b] program, then [b]right-clicking[/b] on a hostile bot.")
			Npc:says(_"The field of play is split into two sides, one yellow, one purple, representing circuit boards.")
			Npc:says(_"In the center of the field is a column of boxes known as logic cores. These cores have wires attached to them from both circuit boards.")
			Npc:says(_"Your objective is to activate as many cores in your chosen color as possible at the end of each round.")
			Npc:says(_"This is accomplished by selecting a wire with the up or down buttons, then pressing spacebar to activate that core.")
			Npc:says(_"You will be given about 10 seconds initially to select which color you want with spacebar.")
			Npc:says(_"At that point, you have 10 more seconds in which to activate more cores than the bot.")
			Npc:says(_"Each activation of one core will consume one charge and you have a limited number of charges, 3 by default, so choose your targets carefully.")
			Npc:says(_"I can tell you about some more advanced techniques, if you'd like.")
			if (not TutorialTom_updated_hacking_quest) then
				Tux:update_quest("Tutorial Hacking", _"Apparently in order to hack, all I have to do is select the Hacking program, right click a bot, and play a little game. I've got this!")
				TutorialTom_updated_hacking_quest = true
			end
			show("node52", "node53", "node54") hide("node51")
		end,
	},
	{
		id = "node52",
		text = _"What was that about activating more cores than the bot?",
		code = function()
			Npc:says(_"Ah, yes. While you are busy trying to take the bot over, it will be busy trying to stop you.")
			Npc:says(_"The truth is, if the bot programming was perfect, it would be almost impossible to defeat.")
			Npc:says(_"Fortunately for you, software bugs do indeed exist, and therefore some cores will be on your side from the beginning.")
			Npc:says(_"Likewise, the bots only have a limited number of charges. Occasionally, they will have more than you, but that is a risk you have to take.")
			Npc:says(_"Because you are initiating the attack, you do get to choose your side, which can let you handicap the bot greatly if used wisely.")
			hide("node52")
		end,
	},
	{
		id = "node53",
		text = _"Tell me about more advanced techniques.",
		code = function()
			Npc:says(_"Each charge will activate and remain active for a certain amount of time. This will let you take over a core that a bot just took over.")
			Npc:says(_"Sometimes, the bots will already have charges on the wires. When you activate one of these, it will increase the time that wire is activated for.")
			Npc:says(_"The bot can use this trick too, so it may be wise to give up a heavily guarded wire for an easier target.")
			Npc:says(_"The wiring inside the bots sometimes contain splitters. These can be used in two ways.")
			Npc:says(_"A 2-to-1 splitter is undesirable. This requires two charges to activate one core, halving your efficiency.")
			Npc:says(_"A 1-to-2 splitter, however, will activate two nodes for the price of one charge.")
			Npc:says(_"Sometimes these splitters will be stacked. Tracing the route ahead of time will be crucial to your tactical success.")
			Npc:says(_"Ideally, you want to stick your opponent with 2-to-1 splitters, while you have 1-to-2 splitters at your disposal.")
			Npc:says(_"Finally, remember that patience is often a virtue. Taking over all cores early on only to lose them later can be a crushing blow.")
			hide("node53")
		end,
	},
	{
		id = "node54",
		text = _"I'm ready to try hacking bots.",
		code = function()
			Npc:says(_"I certainly hope so.")
			Npc:says(_"I should, however, take the time to tell you a few more things.")
			Npc:says(_"Hacking, like most other programs, incurs a cost to you.")
			Npc:says(_"Processing programs seems to heat up your brain.")
			Npc:says(_"You seem to be able to handle quite a bit of heat, but you have your limits.")
			Npc:says(_"If you do not use all charges when attempting to take over a bot, you will spare some heat.")
			Npc:says(_"Not activating all charges or beating the bot with a comfortable winning margin is less exhaustive for you.")
			Npc:says(_"If you nevertheless accumulate too much heat, you will automatically shut down in order to cool off.")
			Npc:says(_"Over time, the heat will seep away from your body naturally. However, there are ways to speed up the process.")
			Npc:says(_"If you can find them, cooling drinks will quickly relieve your thermal discomfort, in much the same way healing drinks help your health.")
			Npc:says(_"Remember you also have a special program called [b]Emergency Shutdown[/b] that will lower your heat level drastically. Unfortunately using Emergency Shutdown will shut you down and render you paralyzed for several seconds. It makes you a sitting duck... er, penguin.")
			Tux:says(_"I take it that was a joke also?")
			Npc:says(_"Quite.", "NO_WAIT")
			Npc:says(_"In addition to hacking, you have the ability to execute arbitrary code on bots.")
			Npc:says(_"These scripts and programs can be learned through reading source code books. To read a book, right-click on it in inventory.")
			Npc:says(_"You should have recovered your hacking ability by now, and I'll give you a couple of source code books as well.")
			show("node55", "node57") hide("node54")
		end,
	},
	{
		id = "node55",
		text = _"Thanks. I'm ready now.",
		code = function()
			Npc:says(_"We have several bots behind that fence for you to practice on.")
			Npc:says(_"Take them over, then talk to me when they're all dead.")
			Npc:says(_"If you need more help, don't hesitate to ask.")
			Npc:says(_"Oh, and Linarian... If you fail when hacking, you'll receive an electrical shock.")
			Npc:says(_"It shouldn't kill you, but you need to be aware of it nonetheless.")
			if (not TutorialTom_hacking_bots) then
				Tux:improve_program("Hacking")
				Tux:improve_program("Emergency shutdown")
				Tux:add_item("Liquid nitrogen", 1)
				Tux:add_item("Source Book of Calculate Pi", 1)
				Tux:add_item("Source Book of Malformed packet", 1)
				TutorialTom_hacking_bots = true
				Tux:update_quest("Tutorial Hacking", _"Tutorial Tom wants me to hack those bots. The only thing I need to worry about is overheating. But if I get too hot I can always try the Emergency shutdown program.")
				change_obstacle_state("TutorialTakeoverCage", "opened")
			end
			hide("node55")
			end_dialog()
			-- TODO Also explain improving program revisions
		end,
	},
	{
		id = "node57",
		text = _"Tell me again about take over, I'm not sure I got it all.",
		code = function()
			Npc:says(_"Tell me exactly what part you want me to explain again.")
			Npc:says(_"But things will be much clearer once you try for yourself than when I try to explain.")
			Npc:says(_"Use your experience as notes, and all should be clear.")
			show("node51", "node52", "node53") hide("node57")
		end,
	},
	{
		id = "node58",
		text = _"Can you tell me more about upgrading items?",
		code = function()
			Npc:says(_"You can upgrade most weapons and clothing. First, you'll need some materials to craft add-ons.")
			Npc:says(_"Parts needed for this process can be extracted from bots. You'll have to learn how to do it.")
			Npc:says(_"When you have enough materials, you can craft an add-on. Make sure the add-on is suitable for your equipment.")
			Npc:says(_"After this, you have to make a socket in your equipment so you can plug in the add-on.")
			Npc:says(_"That's the theory. Simple, isn't it?")
			Npc:says(_"I'll give you some materials now and let you craft an add-on.")
			Npc:says(_"Pay attention to the type of socket the add-on needs.")
			Tux:update_quest("Tutorial Upgrading Items", _"Before crafting an add-on I have to get some materials. The best way is to extract them from the bots, using Extract Bot Parts skill. Each add-on requires a socket in the item. When the add-on is ready, I have to create a socket in the item and plug the add-on. Only technicians can craft add-ons or plug them.")
			-- TODO decide on what type of upgrade should player make?
			for i,v in ipairs(items_up) do
				Tux:add_item(v, 20)
			end

			craft_addons()
			Npc:says(_"Now you'll need to pay some more money in order to make a socket and plug in the add-on. Here, take some.")
			Tux:add_gold(1200)
			Npc:says(_"Choose an item and add an appropriate socket by clicking '+' on the right of the item. Then attach the add-on to this item and confirm your choice.")
			upgrade_items()
			Tux:end_quest("Tutorial Upgrading Items",_"Maybe I need some time to practice this, but I got the basics.")
			hide("node58") show("node59", "node60", "node42")
		end,
	},
	{
		id = "node59",
		text = _"I wasted my materials on the add-on I didn't need. Can you give more?",
		code = function()
			Npc:says(_"Yes, but only this time. I'll give you some money too. Just be more careful in the future and make wise choices.")
			Npc:says(_"Reality is not as generous as I am.")
			for i,v in ipairs(items_up) do
				Tux:add_item(v, 20)
			end

			Tux:add_gold(1200)
			Tux:says(_"Thank you.")
			Npc:says(_"Think carefully before you make your next add-on.")
			hide("node59")
		end,
	},
	{
		id = "node60",
		text = _"Upgrading items is still too complex for me. Can you explain it again?",
		code = function()
			Npc:says(_"First step is finding materials. They may be extracted from bots, but you'll have to learn how to do it.")
			Npc:says(_"Those materials can be used in crafting add-ons. Make sure the add-on will fit your equipment. Also, remember the type of the socket your add-on needs.")
			Npc:says(_"I gave you materials. Let's craft an add-on now.")
			craft_addons()
			Npc:says(_"All you have to do now is to choose a suitable item and add a socket by clicking ''+'' on the right of the chosen item.")
			Npc:says(_"Remember you pay for both adding a socket and plugging an add-on.")
			Npc:says(_"Let's try it, shall we?")
			upgrade_items()
			Npc:says(_"I hope it's clear now.")
		end,
	},
	{
		id = "node61",
		text = _"Shops?",
		code = function()
			Npc:says(_"Some people are willing to trade items and circuits with you.")
			--Npc:says(_"Although, if you have too many circuits, they will charge you a bit more.") http://rb.freedroid.org/r/1327/
			Npc:says(_"Most are willing to buy whatever you have, at a discounted price.")
			Npc:says(_"There are also some automated vending machines, that dispense small items.") -- but these cannot buy from you.") -- to be implemented
			hide("node61") show("node62")
		end,
	},
	{
		id = "node62",
		text = _"I would like to practice selling an item.",
		code = function()
			Npc:says(_"I'm going to give you a Small Axe, which you can't use yet, so you can practice selling it to me.")
			Npc:says(_"You will see the Small Axe appear in the lower shop bar. You can sell most of these items.")
			Npc:says(_"Items that you have equipped have a hand icon on them.")
			Npc:says(_"However, if you sell the items from the chest (which should have been equipped automatically) I won't be giving you replacements.")
			Npc:says(_"Select the Small Axe and click the sell button.")
			Tux:add_item("Small Tutorial Axe")
			i = 1
			while (i < 100) do -- this is a ugly hack to get rid of the "Item received: Small Axe" centerprint
				display_big_message("")
				i = i + 1
			end
			hide("node62") next("node63")
		end,
	},
	{
		id = "node63",
		text = _"Let me try that again.",
		echo_text = false,
		code = function()
			trade_with("TutorialTom")
			if (Tux:has_item_backpack("Small Tutorial Axe")) then
				show("node63")
			else
				hide("node63")
				show("node64")
			end
		end,
	},
	{
		id = "node64",
		text = _"How about buying an item?",
		code = function()
			Npc:says(_"Well it is much the same procedure, except the items for sale are on the top row.")
			Npc:says(_"With the circuits from selling the Small Axe to me, you can afford to buy a unit of Bottled ice.")
			Npc:says(_"Since Bottled ice combine together, a slider will pop-up asking how many you'd like to buy.")
			Npc:says(_"You have enough circuits for one unit.")
			sell_item("Bottled Tutorial ice")
			hide("node64") next("node65")
		end,
	},
	{
		--hidden
		id = "node65",
		text = _"Let me try that again.",
		echo_text = false,
		code = function()
			if (Tux:get_gold() < 15) then
				Tux:add_gold(15 - Tux:get_gold())
			end
			trade_with("TutorialTom")
			if (Tux:count_item_backpack("Bottled Tutorial ice") < 1) then
				show("node65")
			else
				hide("node65")
				next("node66")
			end
		end,
	},
	{
		--hidden
		id = "node66",
		code = function()
			Npc:says(_"You will occasionally run into items that can't be sold.")
			Npc:says(_"This generally means that the shopkeeper can't give you a reasonable deal on it.")
			Npc:says(_"Someone else probably wants the item.")
			Npc:says(_"You might check your questbook to see if it is mentioned there.")
			if (Tux:has_item_backpack("Bottled Tutorial ice")) then --before player notices, swap the "tutorial" item to normal one :P
				local Tutorial_ice_amount = Tux:count_item("Bottled Tutorial ice")
				Tux:del_item_backpack("Bottled Tutorial ice", Tutorial_ice_amount)
				Tux:add_item("Bottled ice", Tutorial_ice_amount)
				display_big_message("") -- so that we don't have the Item Received: spam on the screen which might be confusing
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
				display_big_message("")
			else
				Npc:says("ERROR OCCURRED, TutorialTom node 66, player doesn't have bottled tutorial ice, WTF happened??")
			end
			armor_node_one = true
			if (armor_node_two) then
				show("node19")
			end
		end,
	},
	{
		id = "node70",
		text = _"There is a wall in the path! How will we get through?",
		code = function()
			if (cmp_obstacle_state("TutorialWall", "broken")) then
				Npc:says(_"Uhm, looks like the wall is already broken, I'll repair it.")
				change_obstacle_state("TutorialWall", "intact")
			else
				Npc:says(_"Notice that part of it is made of a weak material, glass.")
				Npc:says(_"Obstacles you can interact with change color when your cursor is hovering over them.")
				Npc:says(_"[b]Left click[/b] on the glass wall to break it.")
				Npc:says(_"After you break through the glass wall, walk to the other side so I know you are ready to move on.")
			end
			end_dialog()
		end,
	},
	{
		id = "node71",
		text = _"I defeated all the bots in the cage.",
		code = function()
			Npc:says(_"Well done!")
			Npc:says(_"Then let us move towards the next stage of the Tutorial")
			change_obstacle_state("TutorialGlasswallDoor", "opened")
			Npc:says(_"As a reward, I'm giving you a .22 Automatic pistol.")
			if (Tux:has_item("Source Book of Calculate Pi")) and
			   (Tux:has_item("Source Book of Malformed packet")) then
				--plural
				Npc:says(_"But I have to take these sourcebooks from you to prevent you from cheating in the next section of the tutorial.")
				Npc:says(_"Sorry about that...")
				Tux:says(_"Ok...")
			elseif (Tux:has_item("Source Book of Calculate Pi")) or
			       (Tux:has_item("Source Book of Malformed packet")) then
				--singular
				Npc:says(_"But I have to take this sourcebook from you to prevent you from cheating in the next section of the tutorial.")
				Npc:says(_"Sorry about that...")
				Tux:says(_"Ok...")
			end
			if (Tux:has_item("Source Book of Calculate Pi")) then -- ugly, but it shall do
				Tux:del_item("Source Book of Calculate Pi")
			end
			if (Tux:has_item("Source Book of Malformed packet")) then
				Tux:del_item("Source Book of Malformed packet")
			end
			Tux:add_item(".22 Automatic", 1)
			Tux:add_item(".22 LR Ammunition", 10)
			TutorialTom_has_gun = true
			TutorialTom_hide_71 = true
			hide("node42", "node50", "node51", "node52", "node53", "node57", "node71")
			end_dialog()
		end,
	},

--    							Quick Menu (to jump to sections)

	{
		id = "node80",
		text = _"I'd like to skip to a later section of the Tutorial.",
		code = function()
			Npc:says(_"OK, what would you like to learn about?")
			show("node81", "node82", "node83", "node84", "node85", "node86", "node87")
			hide("node1", "node7", "node80")
		end,
	},

	{
		id = "node81",
		text = _"Chests and Armor",
		code = function()
			Npc:says(_"OK, I'll take us to the Chest.")
			Npc:teleport("TutorialTom-Chest")
			Tux:teleport("TutorialTux-Chest")
			tutorial_chests_and_armor_and_shops()
			next("node10")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node82",
		text = _"Shops",
		code = function()
			Npc:says(_"Remember to pick up the items in the chest.")
			Npc:says(_"I'll tell you about the shops.")
			Npc:teleport("TutorialTom-Chest")
			Tux:teleport("TutorialTux-Chest")
			tutorial_chests_and_armor_and_shops()
			next("node61")
			show("node19")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node83",
		text = _"Melee Combat",
		code = function()
			Npc:says(_"OK, I'll take us to the melee arena and give you some armor.")
			Npc:teleport("TutorialTom-Melee")
			Tux:teleport("TutorialTux-Melee")
			Tux:add_quest("Tutorial Melee", _"I skipped ahead to the Melee practice. Tom gave me some armor to use.")
			tutorial_melee_combat()
			next("node20")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node85",
		text = _"Abilities",
		code = function()
			Npc:says(_"OK, I'll take us there and give you some armor and a weapon.")
			Npc:teleport("TutorialTom-Terminal")
			Tux:teleport("TutorialTux-Terminal")
			tutorial_abilities()
			next("node40")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node86",
		text = _"Upgrading Items & Terminals",
		code = function()
			Npc:says(_"OK, I'll take us there and give you some armor and a weapon to work with.")
			Npc:teleport("TutorialTom-Terminal")
			Tux:teleport("TutorialTux-Terminal")
			tutorial_upgrade_items_and_terminal()
			if (not Tux:has_quest("Tutorial Upgrading Items")) then
				Tux:add_quest("Tutorial Upgrading Items", "")
			end
			next("node58")
			show("node42")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node87",
		text = _"Hacking Bots",
		code = function()
			Npc:says(_"OK, I'll take us to the hacking area. Also, I'll give you some XP so you can improve your cooling.")
			Tux:add_xp(2000)
			Npc:teleport("TutorialTom-Takeover")
			Tux:teleport("TutorialTom-Takeover")
			tutorial_hacking()
			next("node50")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node84",
		text = _"Ranged Combat",
		code = function()
			Npc:says(_"OK, I'll take us to the shooting range and give you some armor and a weapon.")
			Npc:teleport("TutorialTom-Ranged")
			Tux:teleport("TutorialTux-Ranged")
			change_obstacle_state("TutorialShootCage", "opened")
			tutorial_ranged_combat()
			next("node30")
			hide("node81", "node82", "node83", "node84", "node85", "node86", "node87")
		end,
	},

	{
		id = "node99",
		text = _"Let me take a short break and practice on my own for a while.",
		code = function()
			Npc:says(_"Ok, I'll be around if you need any more questions answered. Don't hesitate to ask.")
			end_dialog()
		end,
	},
}