From 95a7db036bed610c695b861307af2dccd790006a Mon Sep 17 00:00:00 2001 From: Bo Thompson Date: Mon, 11 Aug 2025 02:16:39 -0400 Subject: [PATCH] Restructured files and worked on more complex quest progression --- data/items/accessory.gd | 1 + data/items/accessory.gd.uid | 1 + data/items/armor.gd | 1 + data/items/armor.gd.uid | 1 + data/items/blueprint.gd | 1 + data/items/blueprint.gd.uid | 1 + data/items/consumable.gd | 1 + data/items/consumable.gd.uid | 1 + data/items/equipment.gd | 1 + data/items/equipment.gd.uid | 1 + data/items/item.gd | 1 + data/items/item.gd.uid | 1 + data/items/recipe.gd | 1 + data/items/recipe.gd.uid | 1 + data/items/resource.gd | 1 + data/items/resource.gd.uid | 1 + data/items/weapon.gd | 1 + data/items/weapon.gd.uid | 1 + data/names.txt | 1 - graphics/pom.png | Bin 0 -> 4698 bytes graphics/pom.png.import | 40 +++++++++ scenes/start_menu.tscn | 68 ++++++++++++++++ scripts/adventurer_data.gd | 15 ++++ scripts/game_manager.gd | 5 +- scripts/generate_quest_dialog.gd | 3 +- scripts/guild.gd | 4 +- scripts/main_panel.gd | 6 +- scripts/member_panel_entry.gd | 2 +- scripts/npc.gd | 2 +- scripts/quest.gd | 27 ++++-- scripts/quest_board_entry.gd | 2 +- scripts/quest_board_window.gd | 2 +- scripts/quest_info_window.gd | 45 ++++++++++ scripts/quest_info_window.gd.uid | 1 + scripts/quest_log.gd | 2 +- scripts/quest_panel_entry.gd | 6 +- scripts/quest_progress_bar.gd | 60 ++++++++++---- scripts/start_menu.gd | 2 +- scripts/test_scene.gd | 5 +- scripts/top_menu.gd | 6 +- scripts/update_bubble.gd | 2 +- scripts/waypoint.gd | 17 +++- templates/guildhall.tscn | 26 +++++- templates/main_panel.tscn | 7 +- templates/quest_info_window.tscn | 131 ++++++++++++++++++++++++++++++ templates/quest_progress_bar.tscn | 20 ++++- templates/top_menu.tscn | 3 +- 47 files changed, 475 insertions(+), 53 deletions(-) create mode 100644 data/items/accessory.gd create mode 100644 data/items/accessory.gd.uid create mode 100644 data/items/armor.gd create mode 100644 data/items/armor.gd.uid create mode 100644 data/items/blueprint.gd create mode 100644 data/items/blueprint.gd.uid create mode 100644 data/items/consumable.gd create mode 100644 data/items/consumable.gd.uid create mode 100644 data/items/equipment.gd create mode 100644 data/items/equipment.gd.uid create mode 100644 data/items/item.gd create mode 100644 data/items/item.gd.uid create mode 100644 data/items/recipe.gd create mode 100644 data/items/recipe.gd.uid create mode 100644 data/items/resource.gd create mode 100644 data/items/resource.gd.uid create mode 100644 data/items/weapon.gd create mode 100644 data/items/weapon.gd.uid delete mode 100644 data/names.txt create mode 100644 graphics/pom.png create mode 100644 graphics/pom.png.import create mode 100644 scenes/start_menu.tscn create mode 100644 scripts/quest_info_window.gd create mode 100644 scripts/quest_info_window.gd.uid create mode 100644 templates/quest_info_window.tscn diff --git a/data/items/accessory.gd b/data/items/accessory.gd new file mode 100644 index 0000000..36239bd --- /dev/null +++ b/data/items/accessory.gd @@ -0,0 +1 @@ +extends Equipment diff --git a/data/items/accessory.gd.uid b/data/items/accessory.gd.uid new file mode 100644 index 0000000..8489cde --- /dev/null +++ b/data/items/accessory.gd.uid @@ -0,0 +1 @@ +uid://cgj83ykwblo6h diff --git a/data/items/armor.gd b/data/items/armor.gd new file mode 100644 index 0000000..36239bd --- /dev/null +++ b/data/items/armor.gd @@ -0,0 +1 @@ +extends Equipment diff --git a/data/items/armor.gd.uid b/data/items/armor.gd.uid new file mode 100644 index 0000000..d156604 --- /dev/null +++ b/data/items/armor.gd.uid @@ -0,0 +1 @@ +uid://br7m0m1b3pt7u diff --git a/data/items/blueprint.gd b/data/items/blueprint.gd new file mode 100644 index 0000000..2db5f92 --- /dev/null +++ b/data/items/blueprint.gd @@ -0,0 +1 @@ +extends Item diff --git a/data/items/blueprint.gd.uid b/data/items/blueprint.gd.uid new file mode 100644 index 0000000..02da831 --- /dev/null +++ b/data/items/blueprint.gd.uid @@ -0,0 +1 @@ +uid://bsacg2p5p52i6 diff --git a/data/items/consumable.gd b/data/items/consumable.gd new file mode 100644 index 0000000..416a201 --- /dev/null +++ b/data/items/consumable.gd @@ -0,0 +1 @@ +class_name Consumable extends Item diff --git a/data/items/consumable.gd.uid b/data/items/consumable.gd.uid new file mode 100644 index 0000000..8a18d9d --- /dev/null +++ b/data/items/consumable.gd.uid @@ -0,0 +1 @@ +uid://u4b5geefms0g diff --git a/data/items/equipment.gd b/data/items/equipment.gd new file mode 100644 index 0000000..e8817a6 --- /dev/null +++ b/data/items/equipment.gd @@ -0,0 +1 @@ +class_name Equipment extends Item diff --git a/data/items/equipment.gd.uid b/data/items/equipment.gd.uid new file mode 100644 index 0000000..a654b09 --- /dev/null +++ b/data/items/equipment.gd.uid @@ -0,0 +1 @@ +uid://8rqg7oxmunog diff --git a/data/items/item.gd b/data/items/item.gd new file mode 100644 index 0000000..73b210b --- /dev/null +++ b/data/items/item.gd @@ -0,0 +1 @@ +class_name Item extends Object diff --git a/data/items/item.gd.uid b/data/items/item.gd.uid new file mode 100644 index 0000000..b18be4d --- /dev/null +++ b/data/items/item.gd.uid @@ -0,0 +1 @@ +uid://dir7x2m1stwg2 diff --git a/data/items/recipe.gd b/data/items/recipe.gd new file mode 100644 index 0000000..2db5f92 --- /dev/null +++ b/data/items/recipe.gd @@ -0,0 +1 @@ +extends Item diff --git a/data/items/recipe.gd.uid b/data/items/recipe.gd.uid new file mode 100644 index 0000000..c381842 --- /dev/null +++ b/data/items/recipe.gd.uid @@ -0,0 +1 @@ +uid://dng2w33raj38l diff --git a/data/items/resource.gd b/data/items/resource.gd new file mode 100644 index 0000000..2db5f92 --- /dev/null +++ b/data/items/resource.gd @@ -0,0 +1 @@ +extends Item diff --git a/data/items/resource.gd.uid b/data/items/resource.gd.uid new file mode 100644 index 0000000..ab53d49 --- /dev/null +++ b/data/items/resource.gd.uid @@ -0,0 +1 @@ +uid://cjbonsakj28qs diff --git a/data/items/weapon.gd b/data/items/weapon.gd new file mode 100644 index 0000000..36239bd --- /dev/null +++ b/data/items/weapon.gd @@ -0,0 +1 @@ +extends Equipment diff --git a/data/items/weapon.gd.uid b/data/items/weapon.gd.uid new file mode 100644 index 0000000..c42df34 --- /dev/null +++ b/data/items/weapon.gd.uid @@ -0,0 +1 @@ +uid://bgn8ipx38g28o diff --git a/data/names.txt b/data/names.txt deleted file mode 100644 index 5f109ec..0000000 --- a/data/names.txt +++ /dev/null @@ -1 +0,0 @@ -Aseir, Haseid, Kheed, Zasheir, Fodel, Glar, Grigor, Igan, Ivor, Kosef, Mival, Pavel, Sergor, Darvin, Dorn, Evendur, Gorstag, Helm, Morn, Randal, Stedd, Ander, Blath, Bran, Frath, Geth, Lander, Luth, Malcer, Stor, Taman, Bareris, Kethoth, Mumed, Urhur, Borivik, Faurgar, Jandar, Kanithar, Madislak, Ralmevik, Shaumar, Vladislak, Chen, Chi, Fai, Jiang, Jun, Lian, Long, Meng, Shan, Wen, Anton, Diero, Marcon, Pieron, Rimardo, Romero, Salazar, Umbero, Atala, Ceidil, Hama, Jasmal, Meilil, Yasheira, Zasheida, Arveene, Esvele, Jhessail, Kerri, Lureene, Miri, Rowan, Tessele, Alethra, Kara, Katernin, Mara, Natali, Olma, Tana, Zora Betha, Cefrey, Kethra, Mara, Olga, Silifrey, Westra, Arizima, Chathi, Nephis, Nulara, Murithi, Sefris, Thola, Umara, Zolis, Hulmarra, Immith, Imzel, Navarra, Shevarra, Tammith. Yuldra, Bai, Chao, Jia, Lei, Mei, Qiao, Shui, Tai, Balama, Dona, Faila, Jalana, Luisa, Marta, Quara, Selise, Vonda \ No newline at end of file diff --git a/graphics/pom.png b/graphics/pom.png new file mode 100644 index 0000000000000000000000000000000000000000..894dc81c03505f1706457a81453261c373d4d84d GIT binary patch literal 4698 zcmV-g5~b~lP)Px{6iGxuRCt{2nt5@=)I@aPqHL0S}fZ!wp^Av6GCY$n}o%r9iSyp zDAQ#+v<%At9f}DVN*4mO11&8Lg_gn;0t_@TP!fwIq%nas5F@fEw)WN9r6)bT<=%Tv z|9J8mC)QJ(^dEm`-psq(@BDt>`#ZnooC{ZR6<2W;S8)|r@j~Lr(WcHLN1NXJ|E&jr zdLaipamx8^KhYoceY!c7+-L}aEi52zt{$@D1+%w<(_?UV9N18iz7=CASOH0v@ zvab3>x-snrMIRu$QN^zm%Ju-OHgm1FdkiOHlc=n;va|VXG7FizZ$7%^E&uiLk^ek% z-*0_vtEYXvHw^W=3;Du9qxD?FzvxrQ70`hm`rcoSn=5Nlc_^CzukCcy z^*na$+l8_$%y#2V^iAX@2Pf{h=}&e&;MOf)8;1I`ey%7+6ZfKSq`7U&R8_hruq^A% z#+anh+FxGCIDXOp>hob#IVe8{IKixlgEkmTL;$aGM-xSVmBrJUQDcNn&Gmjf9>Bk-X=ZHdNe{H#)z)Ng6jo0`+g z7|r6$Jf}|d(y*d^zwYHzo}&!4d)1~YTKBYbdU%q7 z$4^mNSIsrQzAp@YUp;lAS8^+>RHQ0cSz4x8C}LSca$(cL{+{|`i}Gt-QWERh1g`yi80a`Gv{J zb=kIIhK=d;Pbu_hYCBK@(c5H0hCI|uoKVW)f zlDXL#7IX0a#~OM0vWElYfFzhD*JZF+gqQcZ=vnJ+w zesg7|yR*KYrc{da6Y5|0_2oW2J|27C2sncee)m;>*Zvx_wG55};rP|Bszu`*o4S#r80o;D% z?)N49c2<@bdE#fkBpQ#hwWEcxz7g`-92f{~5sbkYgJ1NC#3Hn|v@n!5jKquBS^z{q z3`oHk=8T~j1hfZ%yrI6Hn>#zr%I@9V)Y)m?)Ydk%SL9J8;w={n6vOaowoI?AtgFI$ zP9E^ewp+GF4)i`0-tjG{!tV%^M9?pm=oTNp3kF;m|~C zJ;NCbBox7W&1*tQrNZ2ozwC%@udycxaNk1@QLt?$v)SzXpyF~uH|zli54`re=yi`h zS#ixmL#$e)xLTy+WiJXVt1C@iW13A(4H#o6Wy%X70RsrteVWHsGhgBv~H)SF-;_0 zNz;%&eNDsGaMQNU=rBYn#p-f)&FJ%p5D1;p-=Zpmfs!CtUS|0NAHZsE#yxltRVc{B z)D)S;Me?2(jB9P)xwNz{?=FjgLtR}0pxofgl3dx9YK)p_JWe8&z(X-rC$*UhYyw>p zZd;5Gj52a^2;04|<_a;aXrFEV2Kq7Ag&<({_S?yQ^{eDvm!YvS6H$tuM8f%Nh^$vs zSp*#G?lyz~bVeHTsbp2sQ>sL?81P+j%=s_c00K+%i;SEcMs#WZD-AN8V@3P? z=47-S70$u3(3uR8x4n&%Jw4LkMdh;GtEB5_11EX#UY zq*F>!C=|$Nb9~{xZOqL~F+DJgXhZ13GBcY35c|7;b1VnZ?C@ ztBFKeV#*r#@ZqjKVZl5VtG2HdS7SR4CNySpcwFS7xhx_~42}^LOG^cJ9NW&=%otiU z)~rTnR%p(-7%3^C%TgOG%VH%6=(+7SEZ5~^IxW2&9rWzmxAK7-Z+zo=<&;Of@RFI{ z;0Kj$yf`fScoC23@kyB;n?eZ}B-P2`ac0J+h{n#j`0gQ>*|8Z^9Zc6`dD-a-M3-+o zfU+!}>hDKfms6WJ^F%t$YHckzPT`RtSY5ZA_1tvJCwDgf{#Tk>Omum3b5~*iQf>r= zI~h&HGYhi|q^eU`jsvFT`qN{l896nCAGfGmJSV3%mq3OVSoCw4P}4aXxwsNp*V=$m ziseiOaycf_X@1z&MkJr-RYAZi#G|mT6bS2Vhx4oXJMshebza9E;j&G2M&<&Jc_o>rhx%xR_o6IpS@xP-1V1ZpLy+vHs||#PJS#^ovd>cajBTm z`O&GF?AGNPM#m=Do2q7Uagq7yCHDSw7k?Cl_|}ExxH7P81-#=&wRA4#DB90H2hYR? zkJ8&;03H`%9#}AjeRXwIbat}n`&e3oZL=DNmo7h_0cGXP*L;<@|3K@PYKqpIA}E&p z*v#I&zf(7y{YPRu+9~E1S-#iM-&cX}Y3glt_44gd4EmKp3BHZcw&no|& zw#^dYiLeUPL?XOw|9+Cy)r4AO*4pZejW1baudOOT*WtrvJtUM(fQbCsrOv0ayJ(2) zfTaW|gV6?GYm`!4vv)7;nG9p&&j@KY%|(`i!m z^%S+n56;_r5y4T4#l=NJpfZ(0YmIEc%gQD|8S^yiSNl%!%Ts-%H*MxcyOI=a8`j>C zF@}7hfJCEg*|CGV#zy*jdUz|PVkYhTB&w^~mQ12zF>KEx5{nUw#Xu?Y7ki8du2PKl z_w(e$1Qm&10fZu0YXi>B&GY+V$oFSY^Wz7nxc0ySh{Z7Hy)~mX zfz~*l$JU)YDfaeaD@DAfhRrQ4gcrHAHU`3r7Ij1*2sqKx!&oN6zl0(0@;tJ>PsDL9 zx%hH9l)p0stH4>~J>Mtq`|Jh|h9S3F7Iz;%&P%s!!Es%jni^t>1mStc#FI&0dfjyZ zgkgBWwP(WO$OyL9JksA!ty26WaHiVPVTiG;a!mm?5(9!@5V-#Au?R7(NdpPs)-dGX zl;V3MBe-EmRXk2xdpq?F4Ftvz1_8zxipAo(##>ohqOY%y`Nc)1jp4B4@TXx&^?CPX zgMg^(mTL;Ikt|?Ybr%S*ET#(uo>Gcmr&Ox`vDVxm!WUeZr-FcdZ!i5rLv(E4PHj3( zU<^SJARKFQ?V94lIra$Rl<0*if=KK6 z$15T%g&}uZ7Tdy*3Q7geE@Swj@AH6C++kTv=W-l>^ikrDLtASrjZIC2#-Pr$(OMJu zJ~Q+44D|J}n9t)n4z)^gOBnJdV+epErS9SU3Nj2XyF34kC_e^>JZ;6n6pN%ikAPBT zWdI+@ig2wlywvykx^44g&*PLaJaO_Q+2LWNu8w3?70R-3gMjJ2J_d3*ijG5_=W)H( zyxI3@G=@15E;Y;DFl2donYy~VOI*D?%HJKnMEmZzE_;n(6Qvy<3#bIXr4;um#aqIV zcLV`9h;UpfzT`OcXiao-lKAvA)s>a3YRya-(&#wctTlU$q0JZ;fVVmhb;j`SFeJG) z=9yiPWf3a#`3)Hl8(4|5;YUBe|NaZki3ky6jJ>AVDliY+uM~qK{FQCMEc9E ztgI_2Y~&M}UtOHEL~Cr35MwMCBtnUVGc&UY{I_NC;vgUa)!14=6xG2sM5Tg``FUIko{3N#?V>YrcFne(wZUde%mR?&32AC0H zc`drzz?cXNYsUht0COU|#2AvsFfT%J?V18IB8;3j?+q}b)Y%xb1jPztv<9cXJT|A`;d>wg_ie#S1{N=9*GcnDL8b36STUr<||UkjMoe5CtM=V-VnR z5%X=!vPDGV7rFoOhaMUTi^bnwuRR;u88VQY9vu9^nPWc))Du8I1gAvu3iM86xW*VX zrHoJoG(3~Qi=ctc#;|4We*hfNnmxu~z$`(2N^3c0S(wVovqi+jT+h4l-o_qf1P*;}> z3=BL!1hlueKW5wZjZgmSSKn;gx${*34coR6ot~EdVo_}Y%YxMu*d4~Gy~fbMx#dr5 z?WcegrD@=;U2`bC@ooI=A1oZd!GcY*#!(BUf{`p9Mzqh5ewF)5K+)Qm-8~-#stWJt}zozx7QwogM z`B7sW=oev9gil%)*BQfcrN|q@NfFxCNHCP9fCiHQK4Dq%J#eP=ou{67qPeA`<80m?864!aZPONp?v``a zE0p4%Oo{M$%i?EB;fpW;JfRfdSBibc&`K$8tigD|PaH??5}{^hMocEtQ@3Z&R)E>r z+3PLKy5m@P_n(w&{27IwGY)lieG+&-uo{Z6d2%u)tE;58Z(n_X5X6!Ynsfb&*kCOI ziz38~;in?(Hijgn7PoLtbOG=b@cp^D;1`pV_HtDfllArFqR~*awv@=N_jGsvyrMZ81yCZQED+b%}p{}lb zffwC<-+d2uz+3EmKD3pxwATFZ=%{{hX=yo9Rh4RwL`cPAQezCt7%LQUMhk^_mG3jR zu&_KdH#d-l(LHr_uQ=S%kqnh0;W#w9uKlTd?>%;?tLyl&?(TK(|2-S77y*a6y5v}Q z_Y#!8{ void: stats = StatBlock.new() @@ -53,6 +54,20 @@ func assign_quest(quest : Quest) -> void: func full_name() -> String: return given_name + " " + surname +func gain_level() -> void: + level += 1 + #TODO: Make stats improve based on job + Game.notice("%s has reached level %d!" % [full_name(), level]) + +func gain_exp(amount : int) -> void: + exp += amount + while exp >= get_tnl(): + exp -= get_tnl() + gain_level() + +func gain_gold(amount :int) -> void: + gold += amount + func get_tnl() -> int: if job: return job.get_tnl(level) diff --git a/scripts/game_manager.gd b/scripts/game_manager.gd index aa927ae..555259f 100644 --- a/scripts/game_manager.gd +++ b/scripts/game_manager.gd @@ -6,14 +6,11 @@ var quest_log : QuestLog = null var top_menu : TopMenu = null var active : bool = true var end_shift_confirmation : ConfirmationDialog -var end_shift_confirm_template = preload("res://end_shift_confirmation.tscn") +var end_shift_confirm_template = preload("res://templates/end_shift_confirmation.tscn") func _ready() -> void: DisplayServer.register_additional_output(self) end_shift_confirmation = end_shift_confirm_template.instantiate() add_child(end_shift_confirmation) - #var file =FileAccess.open("res://name.txt",FileAccess.READ) - #var text =file.get_line() - #var nmnames = text.remove_chars(" ").split(",") func _process(delta: float) -> void: if active and Input.is_action_just_pressed("switch modes"): diff --git a/scripts/generate_quest_dialog.gd b/scripts/generate_quest_dialog.gd index b124014..3c005c6 100644 --- a/scripts/generate_quest_dialog.gd +++ b/scripts/generate_quest_dialog.gd @@ -15,8 +15,7 @@ func generate_quest() -> void: func update_quest_window() -> void: if quest: %NameField.text = quest.name - match(quest.difficulty): - 1: %DifficultyField.text = "Trivial" + %DifficultyField.text = quest.difficulty_name() %LocationField.text = quest.location #for reward in quest.rewards.: diff --git a/scripts/guild.gd b/scripts/guild.gd index 6b1cc1d..f6c1182 100644 --- a/scripts/guild.gd +++ b/scripts/guild.gd @@ -3,8 +3,8 @@ extends Node const visitors = { "test": { - "data":preload("res://test_adventurer.tscn"), - "sprite":preload("res://test_adventurer_sprite.tscn") + "data":preload("res://templates/test_adventurer.tscn"), + "sprite":preload("res://templates/test_adventurer_sprite.tscn") } } diff --git a/scripts/main_panel.gd b/scripts/main_panel.gd index c2f31b2..22ef1ff 100644 --- a/scripts/main_panel.gd +++ b/scripts/main_panel.gd @@ -1,7 +1,7 @@ class_name GamePanel extends MarginContainer -const notice_template = preload("res://notice_panel.tscn") -const quest_progress_bar_template = preload("res://quest_progress_bar.tscn") +const notice_template = preload("res://templates/notice_panel.tscn") +const quest_progress_bar_template = preload("res://templates/quest_progress_bar.tscn") signal time_changed(time : float) @@ -15,8 +15,8 @@ func _process(delta: float) -> void: func add_quest_progress_bar(quest : Quest) -> void: var qpb : QuestProgressBar = quest_progress_bar_template.instantiate() - qpb.setup(quest) %QuestList.add_child(qpb) + qpb.setup(quest) #TODO: Change the hero portrait to match if quest.steps > 1: for i in range(quest.steps-1): diff --git a/scripts/member_panel_entry.gd b/scripts/member_panel_entry.gd index 003c324..f2c7518 100644 --- a/scripts/member_panel_entry.gd +++ b/scripts/member_panel_entry.gd @@ -1,6 +1,6 @@ extends PanelContainer -const npc_profile_window_template = preload("res://npc_profile_window.tscn") +const npc_profile_window_template = preload("res://templates/npc_profile_window.tscn") var _enabled: bool var enabled: bool: get: diff --git a/scripts/npc.gd b/scripts/npc.gd index 0529149..ff78eea 100644 --- a/scripts/npc.gd +++ b/scripts/npc.gd @@ -1,6 +1,6 @@ class_name Npc extends Person -const popup_template = preload("res://profile_popup.tscn") +const popup_template = preload("res://templates/profile_popup.tscn") var profile_popup @export var is_player : bool = false diff --git a/scripts/quest.gd b/scripts/quest.gd index a302708..c025e69 100644 --- a/scripts/quest.gd +++ b/scripts/quest.gd @@ -6,9 +6,27 @@ enum Status{ TAKEN, IN_PROGRESS, COMPLETED, - FAILED + FAILED, + CLOSED } +class Event: + enum Type{ + WAIT, + COMBAT, + CHOICE + } + var type : Type = Type.WAIT + var enemies : Array[String] = [] + var time : float = 1 + var time_elapsed + signal completed() + + func process(delta : float) -> void: + #TODO: Make quest combat work + time_elapsed += delta + if time_elapsed >= time: + completed.emit() var name : String = "A Basic Quest" var desc : String = "The default quest, with no special anything." @@ -17,10 +35,7 @@ var location : String var steps : int = 1 var rewards : Dictionary var length : float = 10 -var step_outcomes : Array = [ - {"pass":"I succeeded!", "fail":"I failed!"} -] - +var events : Array[Event] = [] var progress : float = 0 @@ -57,6 +72,8 @@ func complete() -> void: #else it's a guild item they'll bring back for us Game.notice("%s completed the quest '%s'!" % [questor.full_name(), name]) +func num_events() -> int: + return len(events) #TODO: Put in quest requirements func is_eligible(member : AdventurerData) -> bool: return !taken diff --git a/scripts/quest_board_entry.gd b/scripts/quest_board_entry.gd index e4762fa..c703c4e 100644 --- a/scripts/quest_board_entry.gd +++ b/scripts/quest_board_entry.gd @@ -1,7 +1,7 @@ class_name QuestBoardEntry extends Button -const quest_window_template = preload("res://quest_window.tscn") +const quest_window_template = preload("res://templates/quest_window.tscn") var quest : Quest = null @onready var tex_icon : TextureRect = %Icon @onready var name_label : Label = %NameLabel diff --git a/scripts/quest_board_window.gd b/scripts/quest_board_window.gd index 16826b0..48a649f 100644 --- a/scripts/quest_board_window.gd +++ b/scripts/quest_board_window.gd @@ -1,6 +1,6 @@ class_name QuestBoardWindow extends Popup -const entry_template = preload("res://quest_board_entry.tscn") +const entry_template = preload("res://templates/quest_board_entry.tscn") @onready var entry_list : VBoxContainer = %Entries diff --git a/scripts/quest_info_window.gd b/scripts/quest_info_window.gd new file mode 100644 index 0000000..bbcef95 --- /dev/null +++ b/scripts/quest_info_window.gd @@ -0,0 +1,45 @@ +extends Window + +@onready var nameLabel : Label = %NameLabel +@onready var difficultyLabel : Label = %DifficultyLabel +@onready var locationLabel : Label = %LocationLabel +@onready var advRewardList : GridContainer = %AdventurerRewardList +@onready var guildRewardList : GridContainer = %GuildRewardList +var quest : Quest + +func setup(qst : Quest) -> void: + quest = qst + quest.status_changed.connect(_on_quest_changed) + update() + #TODO: Show quest rewards + +func update() -> void: + nameLabel.text = quest.name + difficultyLabel.text = quest.difficulty_name() + locationLabel.text = quest.location + #TODO: Show the current status of the quest + +func close() -> void: + hide() + queue_free() + +func _on_quest_changed(status : Quest.Status) -> void: + if status == Quest.Status.CLOSED: + close() + else: + update() + +func _on_remove_quest_confirm() -> void: + Guild.remove_quest(quest) + close() + +func _on_remove_quest_cancel() -> void: + %ConfirmDialog.hide() + + +func _on_remove_button_pressed() -> void: + pass + + +func _on_back_button_pressed() -> void: + close() diff --git a/scripts/quest_info_window.gd.uid b/scripts/quest_info_window.gd.uid new file mode 100644 index 0000000..9908fc7 --- /dev/null +++ b/scripts/quest_info_window.gd.uid @@ -0,0 +1 @@ +uid://cip5x34n08ilk diff --git a/scripts/quest_log.gd b/scripts/quest_log.gd index 977542d..b69f668 100644 --- a/scripts/quest_log.gd +++ b/scripts/quest_log.gd @@ -1,6 +1,6 @@ class_name QuestLog extends Control -const entry_template = preload("res://quest_log_entry.tscn") +const entry_template = preload("res://templates/quest_log_entry.tscn") @onready var entry_list : VBoxContainer = %Entries var entries : Array[QuestLogEntry] = [] diff --git a/scripts/quest_panel_entry.gd b/scripts/quest_panel_entry.gd index 2bfcb01..c84c6d4 100644 --- a/scripts/quest_panel_entry.gd +++ b/scripts/quest_panel_entry.gd @@ -1,5 +1,6 @@ extends PanelContainer +const quest_info_window_template = preload("res://templates/quest_info_window.tscn") var _enabled: bool var enabled: bool: @@ -30,7 +31,10 @@ func setup(qst : Quest) -> void: func _on_gui_input(event: InputEvent) -> void: var evt = event as InputEventMouseButton if evt and evt.button_index == MOUSE_BUTTON_LEFT and evt.pressed: - print("Quest clicked!") + var wnd = quest_info_window_template.instantiate() + add_child(wnd) + wnd.setup(quest) + wnd.popup_centered() func _on_quest_status_changed(status: Quest.Status) -> void: match(status): diff --git a/scripts/quest_progress_bar.gd b/scripts/quest_progress_bar.gd index 82bd899..3aff8b6 100644 --- a/scripts/quest_progress_bar.gd +++ b/scripts/quest_progress_bar.gd @@ -1,16 +1,20 @@ class_name QuestProgressBar extends Control -const waypoint_template = preload("res://waypoint.tscn") +const waypoint_template = preload("res://templates/waypoint.tscn") var length : float -var waypoints : Array = [] +var waypoints : Array[Waypoint] = [] @onready var hero_offset : Vector2 = %Hero.position @onready var hero : HeroIcon = %Hero +@onready var heroLabel : Label = %HeroLabel @onready var startpoint : Endpoint = %Start @onready var endpoint : Endpoint = %End @onready var bar : TextureProgressBar = $ProgressBar @onready var path : Control = %Path +@onready var speech_bubble = %SpeechBubble var quest : Quest = null +var current_event : Quest.Event = null var time_elapsed : float = 0 +var next_waypoint = 0 #signal value_changed(value : float) #var min_value #var max_value @@ -22,17 +26,16 @@ var time_elapsed : float = 0 #var allow_greater func _ready() -> void: length = path.size.x - if quest: - #Generate the waypoints - generate_waypoints() - #TODO: Change the hero's portrait - bar.value = quest.progress hero.position = hero_offset + Vector2(length * bar.value / bar.max_value, 0) func _process(delta: float) -> void: if time_elapsed < quest.length: - time_elapsed += delta - progress_quest() + if current_event != null: + if current_event.type != Quest.Event.Type.COMBAT: + current_event.process(delta) + else: + time_elapsed += delta + progress_quest() func generate_waypoints(): if len(waypoints) > 0: @@ -40,16 +43,20 @@ func generate_waypoints(): wp.queue_free() waypoints = [] - for i in range(1,quest.steps): - var pct : float = i / float(quest.steps) - add_waypoint( pct, quest.step_outcomes[i]) + #Include the "end" in the count + var num = quest.num_events()+1 + for i in range(1,num): + var pct : float = i / float(num) + add_waypoint( pct, quest.events[i-1]) -func add_waypoint(pct : float, msgs : Dictionary): +func add_waypoint(pct : float, event : Quest.Event): var wp = waypoint_template.instantiate() waypoints.append(wp) wp.percent = pct + #TODO: Make events matter + wp.event = event %Waypoints.add_child(wp) - wp.global_position = global_position + Vector2(pct * length - 16, -9) + wp.global_position = %Waypoints.global_position + Vector2(pct * length - 16, -9) if bar.value / bar.max_value >= pct: wp.fill = true @@ -59,13 +66,36 @@ func update_waypoints(value : float) -> void: wp.fill = (bar.value / bar.max_value >= wp.percent) endpoint.fill = (bar.value / bar.max_value >= endpoint.percent) +func start_event(event : Quest.Event, offset : float) -> void: + current_event = event + current_event.completed.connect(_on_event_complete) + event.time_elapsed = offset + func setup(quest : Quest) -> void: self.quest = quest + heroLabel.text = quest.questor.full_name() time_elapsed = 0 + #Generate the waypoints + generate_waypoints() + #TODO: Change the hero's portrait + bar.value = quest.progress func progress_quest() -> void: - bar.value = clampf(time_elapsed / quest.length, 0, bar.max_value) + var pct = time_elapsed / quest.length + if next_waypoint < len(waypoints) and pct >= waypoints[next_waypoint].percent: + start_event(waypoints[next_waypoint].event, (pct - waypoints[next_waypoint].percent) * quest.length) + pct = waypoints[next_waypoint].percent + waypoints[next_waypoint].blink(true) + bar.value = clampf(pct, 0, bar.max_value) hero.position = hero_offset + Vector2(length * bar.value / bar.max_value, 0) if time_elapsed >= quest.length: quest.complete() update_waypoints(bar.value) + + +func _on_event_complete() -> void: + #TODO: Show event message! + speech_bubble.show_message("Event complete!") + waypoints[next_waypoint].blink(false) + next_waypoint += 1 + current_event = null diff --git a/scripts/start_menu.gd b/scripts/start_menu.gd index c958fcd..4834a06 100644 --- a/scripts/start_menu.gd +++ b/scripts/start_menu.gd @@ -2,4 +2,4 @@ extends Control func _on_button_pressed() -> void: - get_tree().change_scene_to_file() + get_tree().change_scene_to_file("res://scenes/active_scene.tscn") diff --git a/scripts/test_scene.gd b/scripts/test_scene.gd index 3e1ce0c..a354568 100644 --- a/scripts/test_scene.gd +++ b/scripts/test_scene.gd @@ -1,8 +1,11 @@ extends Node2D -var test_adv = preload("res://test_adventurer.tscn") +var test_adv = preload("res://templates/test_adventurer.tscn") func _ready() -> void: #var adv : AdventurerData = test_adv.instantiate() as AdventurerData #Guild.register_guild_member(adv) var quest : Quest = Quest.new() + var evt : Quest.Event = Quest.Event.new() + evt.time = 10 + quest.events.append(evt) Guild.add_quest(quest) diff --git a/scripts/top_menu.gd b/scripts/top_menu.gd index 561272a..c8b2a39 100644 --- a/scripts/top_menu.gd +++ b/scripts/top_menu.gd @@ -1,8 +1,8 @@ class_name TopMenu extends Control -const member_panel_entry_template = preload("res://member_panel_entry.tscn") -const quest_panel_entry_template = preload("res://quest_panel_entry.tscn") -const guild_info_window_template = preload("res://guild_info_window.tscn") +const member_panel_entry_template = preload("res://templates/member_panel_entry.tscn") +const quest_panel_entry_template = preload("res://templates/quest_panel_entry.tscn") +const guild_info_window_template = preload("res://templates/guild_info_window.tscn") @onready var members_list = %MembersList @onready var members = %Members diff --git a/scripts/update_bubble.gd b/scripts/update_bubble.gd index b470ea7..e5312ea 100644 --- a/scripts/update_bubble.gd +++ b/scripts/update_bubble.gd @@ -4,7 +4,7 @@ extends NinePatchRect @onready var timer : Timer = %Timer func _ready() -> void: - show_message("TESTING, 1 2 3\nTESTING!!!!") + pass func show_message(msg : String, show_time : float = 1.0) -> void: diff --git a/scripts/waypoint.gd b/scripts/waypoint.gd index c36dd69..3a82727 100644 --- a/scripts/waypoint.gd +++ b/scripts/waypoint.gd @@ -1,7 +1,10 @@ class_name Waypoint extends Control +var event : Quest.Event = null var percent : float = 0 var filled: bool +var blink_tween : Tween +var blinking : bool = false var fill: bool : get: return filled @@ -9,10 +12,22 @@ var fill: bool : if value != filled: set_fill(value) +func blink(blnk : bool) -> void: + if blinking == blnk: + return + blinking = blnk + if blinking: + blink_tween = create_tween() + blink_tween.tween_property($Dot,"modulate:a", 0, .5) + blink_tween.tween_property($Dot,"modulate:a", 1, .5) + blink_tween.set_loops(-1) + else: + blink_tween.stop() + blink_tween = null func set_fill(value : bool) -> void: filled = value - if value: + if value and !blinking: $Dot.visible = true $Fill.modulate = Color.SEA_GREEN else: diff --git a/templates/guildhall.tscn b/templates/guildhall.tscn index 9b84204..a531914 100644 --- a/templates/guildhall.tscn +++ b/templates/guildhall.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=4 uid="uid://cd08dp16bixfv"] +[gd_scene load_steps=14 format=4 uid="uid://cd08dp16bixfv"] [ext_resource type="Script" uid="uid://ccorfvcfa84gf" path="res://scripts/guildhall.gd" id="1_lsinl"] [ext_resource type="TileSet" uid="uid://6im0g3eg6sr4" path="res://test_tiles.tres" id="1_qel1r"] @@ -7,6 +7,9 @@ [ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://graphics/basic-sprite.png" id="4_l3mu1"] [ext_resource type="PackedScene" uid="uid://cf6nnjyp8kv78" path="res://templates/receptionist.tscn" id="5_l3mu1"] [ext_resource type="PackedScene" uid="uid://b3mksvn2jf7e0" path="res://templates/quest_board.tscn" id="7_hph4e"] +[ext_resource type="Script" uid="uid://bh54wpqgau8hc" path="res://scripts/npc.gd" id="8_nhrwr"] +[ext_resource type="Texture2D" uid="uid://dcrhry67g00vk" path="res://graphics/pom.png" id="9_4bidn"] +[ext_resource type="PackedScene" uid="uid://jbqw0n6dlj08" path="res://templates/speech_bubble.tscn" id="10_6hdsl"] [sub_resource type="NavigationPolygon" id="NavigationPolygon_w7eqs"] vertices = PackedVector2Array(591.3203, 170.54688, 591.3125, 170.53906, 614.1094, 159.47656, 694.9531, 80.92969, 694.9375, 80.921875, 702.6406, 67, 1053, 67, 1053, 605, 665.27344, 134.64063, 35, 605, 578.35156, 176.85938, 512.60156, 177.99219, 445.89844, 179.14063, 35, 35, 432.14063, 172.14844, 432.14063, 172.14063, 406.6172, 159.21875, 368.17188, 139.71875, 368.17188, 139.71094, 357.59375, 134.42969, 326.3125, 77.5625, 324.82813, 35, 325.8828, 65.21875) @@ -81,4 +84,25 @@ navigation_polygon = SubResource("NavigationPolygon_l3mu1") [node name="Quest Board" parent="." instance=ExtResource("7_hph4e")] position = Vector2(935, 32) +[node name="Npc" type="CharacterBody2D" parent="."] +z_index = 1 +position = Vector2(400, 27) +script = ExtResource("8_nhrwr") +metadata/_custom_type_script = "uid://bh54wpqgau8hc" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Npc"] +position = Vector2(1, 16) +rotation = 1.5707964 +shape = SubResource("CapsuleShape2D_l3mu1") + +[node name="Sprite2D" type="Sprite2D" parent="Npc"] +texture = ExtResource("9_4bidn") + +[node name="SpeechBubble" parent="Npc" instance=ExtResource("10_6hdsl")] +position = Vector2(44, -93) + +[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Npc"] +path_desired_distance = 30.0 +avoidance_enabled = true + [editable path="Sprites/Receptionist"] diff --git a/templates/main_panel.tscn b/templates/main_panel.tscn index f1d6df9..3b3db07 100644 --- a/templates/main_panel.tscn +++ b/templates/main_panel.tscn @@ -106,7 +106,10 @@ layout_mode = 2 theme_override_styles/normal = SubResource("StyleBoxFlat_q6wja") text = "Show Quests" -[node name="QuestProgressList" type="ScrollContainer" parent="VBoxContainer"] +[node name="Panel" type="PanelContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="QuestProgressList" type="ScrollContainer" parent="VBoxContainer/Panel"] unique_name_in_owner = true visible = false clip_contents = false @@ -114,7 +117,7 @@ custom_minimum_size = Vector2(260, 100) layout_mode = 2 horizontal_scroll_mode = 0 -[node name="QuestList" type="VBoxContainer" parent="VBoxContainer/QuestProgressList"] +[node name="QuestList" type="VBoxContainer" parent="VBoxContainer/Panel/QuestProgressList"] unique_name_in_owner = true custom_minimum_size = Vector2(300, 100) layout_mode = 2 diff --git a/templates/quest_info_window.tscn b/templates/quest_info_window.tscn new file mode 100644 index 0000000..3e8c276 --- /dev/null +++ b/templates/quest_info_window.tscn @@ -0,0 +1,131 @@ +[gd_scene load_steps=6 format=3 uid="uid://map4n3vxmud3"] + +[ext_resource type="Script" uid="uid://cip5x34n08ilk" path="res://scripts/quest_info_window.gd" id="1_87ctw"] +[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://graphics/icon.svg" id="2_isnli"] + +[sub_resource type="LabelSettings" id="LabelSettings_fkhvq"] +outline_size = 2 + +[sub_resource type="LabelSettings" id="LabelSettings_cyayr"] + +[sub_resource type="LabelSettings" id="LabelSettings_w0qqq"] +outline_size = 3 + +[node name="Quest Info Window" type="Window"] +oversampling_override = 1.0 +title = "Quest Information" +size = Vector2i(500, 620) +wrap_controls = true +unresizable = true +popup_window = true +script = ExtResource("1_87ctw") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchors_preset = -1 +offset_right = 500.0 +offset_bottom = 620.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer2"] +layout_mode = 2 +texture = ExtResource("2_isnli") + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2"] +layout_mode = 2 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"] +layout_mode = 2 +text = "Quest Name" +label_settings = SubResource("LabelSettings_fkhvq") + +[node name="NameLabel" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"] +unique_name_in_owner = true +modulate = Color(0.6542321, 0.6542321, 0.654232, 1) +custom_minimum_size = Vector2(365, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "A Simple Task" +label_settings = SubResource("LabelSettings_cyayr") + +[node name="Label2" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"] +layout_mode = 2 +text = "Difficulty" +label_settings = SubResource("LabelSettings_w0qqq") + +[node name="DifficultyLabel" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"] +unique_name_in_owner = true +modulate = Color(0.6542321, 0.6542321, 0.654232, 1) +custom_minimum_size = Vector2(365, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "(Difficulty)" + +[node name="Label3" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Location" +label_settings = SubResource("LabelSettings_w0qqq") + +[node name="LocationLabel" type="Label" parent="VBoxContainer"] +unique_name_in_owner = true +modulate = Color(0.6542321, 0.6542321, 0.654232, 1) +custom_minimum_size = Vector2(480, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "(Location)" + +[node name="Label4" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Adventurer Reward" +label_settings = SubResource("LabelSettings_w0qqq") + +[node name="AdventurerRewardPanel" type="PanelContainer" parent="VBoxContainer"] +custom_minimum_size = Vector2(480, 150) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="AdventurerRewardList" type="GridContainer" parent="VBoxContainer/AdventurerRewardPanel"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="Label5" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Guild Reward" +label_settings = SubResource("LabelSettings_w0qqq") + +[node name="GuildRewardPanel" type="PanelContainer" parent="VBoxContainer"] +custom_minimum_size = Vector2(480, 150) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="GuildRewardList" type="GridContainer" parent="VBoxContainer/GuildRewardPanel"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="RemoveButton" type="Button" parent="VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(248, 60) +layout_mode = 2 +text = "REMOVE" + +[node name="BackButton" type="Button" parent="VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(248, 60) +layout_mode = 2 +text = "BACK" + +[node name="ConfirmDialog" type="ConfirmationDialog" parent="."] +unique_name_in_owner = true +oversampling_override = 1.0 +title = "Remove Quest" +size = Vector2i(329, 100) +visible = true +ok_button_text = "Yes, Remove it" +dialog_text = "Do you really wish to remove this quest?" + +[connection signal="pressed" from="VBoxContainer/HBoxContainer/RemoveButton" to="." method="_on_remove_button_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"] +[connection signal="canceled" from="ConfirmDialog" to="." method="_on_remove_quest_cancel"] +[connection signal="confirmed" from="ConfirmDialog" to="." method="_on_remove_quest_confirm"] diff --git a/templates/quest_progress_bar.tscn b/templates/quest_progress_bar.tscn index 338153b..114252d 100644 --- a/templates/quest_progress_bar.tscn +++ b/templates/quest_progress_bar.tscn @@ -52,6 +52,16 @@ pivot_offset = Vector2(125, 0) size_flags_horizontal = 4 script = ExtResource("1_3w4v3") +[node name="HeroLabel" type="Label" parent="."] +unique_name_in_owner = true +layout_mode = 0 +offset_left = 30.0 +offset_top = 2.0 +offset_right = 223.0 +offset_bottom = 25.0 +text = "Hero Name Here" +horizontal_alignment = 1 + [node name="ProgressBar" type="TextureProgressBar" parent="."] custom_minimum_size = Vector2(213, 14) layout_mode = 0 @@ -143,7 +153,9 @@ position = Vector2(-1, -12) texture = ExtResource("6_lufuo") script = ExtResource("7_nby1n") -[node name="UpdateBubble" type="NinePatchRect" parent="ProgressBar/Hero"] +[node name="SpeechBubble" type="NinePatchRect" parent="ProgressBar/Hero"] +unique_name_in_owner = true +visible = false clip_contents = true anchors_preset = -1 anchor_left = 1.0 @@ -168,7 +180,7 @@ axis_stretch_horizontal = 1 axis_stretch_vertical = 1 script = ExtResource("9_pq74m") -[node name="Label" type="Label" parent="ProgressBar/Hero/UpdateBubble"] +[node name="Label" type="Label" parent="ProgressBar/Hero/SpeechBubble"] unique_name_in_owner = true layout_mode = 0 offset_left = 5.0 @@ -182,7 +194,7 @@ text = "testing one 1 2 3" vertical_alignment = 1 autowrap_mode = 2 -[node name="Timer" type="Timer" parent="ProgressBar/Hero/UpdateBubble"] +[node name="Timer" type="Timer" parent="ProgressBar/Hero/SpeechBubble"] unique_name_in_owner = true [node name="Container" type="Container" parent="ProgressBar"] @@ -199,4 +211,4 @@ offset_top = 34.0 offset_right = 231.0 offset_bottom = 54.0 -[connection signal="timeout" from="ProgressBar/Hero/UpdateBubble/Timer" to="ProgressBar/Hero/UpdateBubble" method="_on_timer_timeout"] +[connection signal="timeout" from="ProgressBar/Hero/SpeechBubble/Timer" to="ProgressBar/Hero/SpeechBubble" method="_on_timer_timeout"] diff --git a/templates/top_menu.tscn b/templates/top_menu.tscn index 64ffc93..8efa24d 100644 --- a/templates/top_menu.tscn +++ b/templates/top_menu.tscn @@ -155,6 +155,7 @@ text = "Generate Quest" [node name="GenerateQuestDialog" type="Control" parent="."] unique_name_in_owner = true +visible = false layout_mode = 1 anchor_right = 1.0 anchor_bottom = 1.0 @@ -182,7 +183,6 @@ grow_vertical = 2 [node name="GenerateQuest" type="VBoxContainer" parent="GenerateQuestDialog/Window"] unique_name_in_owner = true -visible = false layout_mode = 2 [node name="HBoxContainer2" type="HBoxContainer" parent="GenerateQuestDialog/Window/GenerateQuest"] @@ -300,6 +300,7 @@ text = "BACK" [node name="PostQuest" type="VBoxContainer" parent="GenerateQuestDialog/Window"] unique_name_in_owner = true +visible = false layout_mode = 2 [node name="HBoxContainer2" type="HBoxContainer" parent="GenerateQuestDialog/Window/PostQuest"]