From 110e48507b4c26895cc3922bde03fb130d1a6eee Mon Sep 17 00:00:00 2001 From: panurgomatic Date: Mon, 14 Feb 2011 14:08:18 +0000 Subject: [PATCH] - Slight speed up for combat mechs. - Added H.O.N.K construction. - Removed unnecessary mecha parts. - Fixed bug with switching intent while in mecha - Tweaked mecha access permissions (maintenance hatch can be opened if player has any of the mecha internals_req_access permissions, piloting allowed only if player has all of operation_req_access permissions) git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1042 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/mecha/combat/combat.dm | 2 +- code/game/mecha/combat/durand.dm | 2 +- code/game/mecha/combat/gygax.dm | 2 +- code/game/mecha/combat/marauder.dm | 3 +- code/game/mecha/combat/weapons/weapons.dm | 2 - code/game/mecha/construction_datum.dm | 3 + code/game/mecha/mech_fabricator.dm | 19 +- code/game/mecha/mecha.dm | 22 +- code/game/mecha/mecha_construction.dm | 252 +++++++++++++++------- code/game/mecha/working/working.dm | 12 +- code/game/research/designs.dm | 27 +++ icons/misc/mech_construct.dmi | Bin 6962 -> 7231 bytes 12 files changed, 258 insertions(+), 88 deletions(-) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index b3e0256c78c..b61a97ea33a 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -115,7 +115,7 @@ V.show_message("[src.name] hits [target].", 1) if(!istype(target, /turf/simulated/wall)) target:attackby(src,src.occupant) - else if(prob(2)) + else if(prob(5)) target:dismantle_wall(1) src.occupant_message("\blue You smash through the wall.") src.visible_message("[src.name] smashes through the wall") diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 8fd8611a484..fa88be0104a 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -2,7 +2,7 @@ desc = "Combat exosuit." name = "Durand" icon_state = "durand" - step_in = 8 + step_in = 6 health = 350 deflect_chance = 12 max_temperature = 3000 diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 9f71c3e26fd..f74e6eb9030 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -2,7 +2,7 @@ desc = "Security exosuit." name = "Gygax" icon_state = "gygax" - step_in = 6 + step_in = 5 health = 300 deflect_chance = 10 max_temperature = 3500 diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 5a765c4fce9..3fe7dd80a04 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -2,7 +2,7 @@ desc = "Heavy duty combat exosuit." name = "Marauder" icon_state = "marauder" - step_in = 10 + step_in = 7 health = 400 deflect_chance = 25 max_temperature = 5000 @@ -112,6 +112,7 @@ /obj/mecha/combat/marauder/go_out() if(src.occupant && src.occupant.client) src.occupant.client.view = world.view + src.zoom = 0 ..() return diff --git a/code/game/mecha/combat/weapons/weapons.dm b/code/game/mecha/combat/weapons/weapons.dm index 647f7ccad16..a83798866ba 100644 --- a/code/game/mecha/combat/weapons/weapons.dm +++ b/code/game/mecha/combat/weapons/weapons.dm @@ -343,7 +343,6 @@ var/target_y = targloc.y var/target_z = targloc.z targloc = null - target = null for(var/i=1 to min(projectiles, projectiles_per_shot)) targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z) if(!targloc || targloc == curloc) @@ -378,7 +377,6 @@ var/target_y = targloc.y var/target_z = targloc.z targloc = null - target = null spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) if(!chassis) break var/turf/curloc = get_turf(chassis) diff --git a/code/game/mecha/construction_datum.dm b/code/game/mecha/construction_datum.dm index 0008c177334..228d4b8255e 100644 --- a/code/game/mecha/construction_datum.dm +++ b/code/game/mecha/construction_datum.dm @@ -17,6 +17,9 @@ spawn_result() return + proc/action(atom/used_atom,mob/user as mob) + return + proc/check_step(atom/used_atom,mob/user as mob) //check last step only var/valid_step = is_right_key(used_atom) if(valid_step) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 0924b432f5b..9c7f1bcbf23 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -19,7 +19,8 @@ "gold"=0, "silver"=0, "diamond"=0, - "plasma"=0 + "plasma"=0, + "bananium"=0 ) var/res_max_amount = 200000 var/part_set @@ -53,6 +54,16 @@ list("result"="/obj/item/mecha_parts/part/gygax_left_leg","time"=200,"metal"=35000), list("result"="/obj/item/mecha_parts/part/gygax_right_leg","time"=200,"metal"=35000), list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000) + ), + + "H.O.N.K"=list( + list("result"="/obj/mecha_chassis/honker","time"=100,"metal"=20000), + list("result"="/obj/item/mecha_parts/part/honker_torso","time"=300,"metal"=35000,"glass"=10000,"bananium"=10000), + list("result"="/obj/item/mecha_parts/part/honker_head","time"=200,"metal"=15000,"glass"=5000,"bananium"=5000), + list("result"="/obj/item/mecha_parts/part/honker_left_arm","time"=200,"metal"=20000,"bananium"=5000), + list("result"="/obj/item/mecha_parts/part/honker_right_arm","time"=200,"metal"=20000,"bananium"=5000), + list("result"="/obj/item/mecha_parts/part/honker_left_leg","time"=200,"metal"=20000,"bananium"=5000), + list("result"="/obj/item/mecha_parts/part/honker_right_leg","time"=200,"metal"=20000,"bananium"=5000), ) ) @@ -192,13 +203,14 @@ var/time = part["time"] src.being_built = new path(src) src.remove_resources(part) - flick("mechfab3", src) + src.icon_state = "mechfab3" //looks better than 'flick' src.use_power = 2 spawn(time) src.use_power = 1 src.being_built.Move(get_step(src,EAST)) src.icon_state = initial(src.icon_state) src.visible_message("[src] beeps, \"The [src.being_built] is complete\".") + src.icon_state = initial(src.icon_state) src.being_built = null src.updateUsrDialog() src.updateUsrDialog() @@ -229,6 +241,9 @@ else if(istype(W, /obj/item/stack/sheet/glass)) material = "glass" amnt = "g_amt" + else if(istype(W, /obj/item/stack/sheet/clown)) + material = "bananium" + amnt = "g_amt" else return ..() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index ea4bbfa39ae..dc3b97b25f4 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -90,7 +90,13 @@ if(mech_click == world.time) return mech_click = world.time */ - if(!location) return //probably GUI + if(istype(object, /obj/screen)) + var/obj/screen/using = object + if(using.screen_loc == ui_acti || using.screen_loc == ui_iarrowleft || using.screen_loc == ui_iarrowright)//ignore all HUD objects save 'intent' and its arrows + return ..() + else + return +// if(!location) return //probably GUI if(M.stat>0) return if(!istype(object,/atom)) return var/obj/mecha/Mech = M.loc @@ -101,11 +107,12 @@ return ..() /obj/mecha/proc/click_action(atom/target) - if(!istype(target,/turf) && !istype(target.loc,/turf)) return +// if(!istype(target,/turf) && !istype(target.loc,/turf)) return if(!src.occupant) return if(state || !cell || cell.charge<=0) return if(src == target) return - if(!(get_dir(src,target) & src.dir))//wrong direction + var/dir_to_target = get_dir(src,target) + if(dir_to_target && !(get_dir(src,target) & src.dir))//wrong direction return if(get_dist(src,target)<=1) src.melee_action(target) @@ -684,13 +691,16 @@ if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access return 0 for(var/req in src.internals_req_access) - if(!(req in I.access)) //doesn't have this access - return 0 - return 1 + if(req in I.access) + return 1 + return 0 /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) + if(src.occupant) + user << "Unable to initiate maintenance protocol." + return if(src.internals_access_allowed(usr)) if(state==0) state = 1 diff --git a/code/game/mecha/mecha_construction.dm b/code/game/mecha/mecha_construction.dm index bde336ac004..9533fe5cf96 100644 --- a/code/game/mecha/mecha_construction.dm +++ b/code/game/mecha/mecha_construction.dm @@ -9,95 +9,44 @@ var/datum/construction/construct flags = FPRINT | CONDUCT + attackby(obj/item/W as obj, mob/user as mob) + if(!construct || !construct.action(W, user)) + ..() + return + //////// Ripley chassis /obj/mecha_chassis/ripley - name = "Ripley Chassis Frame" + name = "Ripley Chassis" New() ..() construct = new /datum/construction/mecha/ripley_chassis(src) - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/mecha_parts)) - if(construct) - construct.check_all_steps(W, user) - else - ..() - return - -/obj/mecha_chassis/ripley_full - name = "Ripley Chassis" - icon_state = "ripley_chassis" - - New() - ..() - construct = new /datum/construction/mecha/ripley(src) - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(!construct || !construct.check_step(W, user)) - ..() - return - /////// Gygax chasis /obj/mecha_chassis/gygax - name = "Gygax Chassis Frame" + name = "Gygax Chassis" New() ..() construct = new /datum/construction/mecha/gygax_chassis(src) - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/mecha_parts)) - if(construct) - construct.check_all_steps(W, user) - else - ..() - return - -/obj/mecha_chassis/gygax_full - name = "Gygax Chassis" - icon_state = "gygax_chassis" - - New() - ..() - construct = new /datum/construction/mecha/gygax(src) - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(!construct || !construct.check_step(W, user)) - ..() - return - /////// Firefighter chassis /obj/mecha_chassis/firefighter - name = "Ripley-on-Fire Chassis Frame" + name = "Ripley-on-Fire Chassis" New() ..() construct = new /datum/construction/mecha/firefighter_chassis(src) - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/mecha_parts)) - if(construct) - construct.check_all_steps(W, user) - else - ..() - return - -/obj/mecha_chassis/firefighter_full - name = "Ripley-on-Fire Chassis" - icon_state = "ripley_chassis" +/////// HONK chassis +/obj/mecha_chassis/honker + name = "H.O.N.K Chassis" New() ..() - construct = new /datum/construction/mecha/firefighter(src) - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(!construct || !construct.check_step(W, user)) - ..() - return - + construct = new /datum/construction/mecha/honker_chassis(src) ///////////////////////// ////// Mecha Parts ////// @@ -186,6 +135,30 @@ icon_state = "ripley_r_leg" +////////// HONK +/obj/item/mecha_parts/part/honker_torso + name="H.O.N.K Torso" + icon_state = "honker_harness" + +/obj/item/mecha_parts/part/honker_head + name="H.O.N.K Head" + icon_state = "honker_head" + +/obj/item/mecha_parts/part/honker_left_arm + name="H.O.N.K Left Arm" + icon_state = "honker_l_arm" + +/obj/item/mecha_parts/part/honker_right_arm + name="H.O.N.K Right Arm" + icon_state = "honker_r_arm" + +/obj/item/mecha_parts/part/honker_left_leg + name="H.O.N.K Left Leg" + icon_state = "honker_l_leg" + +/obj/item/mecha_parts/part/honker_right_leg + name="H.O.N.K Right Leg" + icon_state = "honker_r_leg" /obj/item/mecha_parts/circuitboard @@ -213,7 +186,7 @@ icon_state = "mcontroller" gygax/targeting - name = "Circuit board (Weapon Control and Targeting module)" + name = "Circuit board (Gygax Weapon Control and Targeting module)" icon_state = "mcontroller" gygax/main @@ -224,6 +197,19 @@ name = "Circuit board (Ripley-on-Fire Peripherals Control module)" icon_state = "mcontroller" + honker/peripherals + name = "Circuit board (H.O.N.K Peripherals Control module)" + icon_state = "mcontroller" + + honker/targeting + name = "Circuit board (H.O.N.K Weapon Control and Targeting module)" + icon_state = "mcontroller" + + honker/main + name = "Circuit board (H.O.N.K Central Control module)" + icon_state = "mainboard" + + //////////////////////////////// ///// Construction datums ////// //////////////////////////////// @@ -268,19 +254,22 @@ ) custom_action(step, atom/used_atom, mob/user) -/* - switch(step) - if(5) - if(4) - if(3) - if(2) - if(1) -*/ user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" del used_atom return 1 + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + spawn_result() + var/obj/mecha_chassis/const_holder = holder + const_holder.construct = new /datum/construction/mecha/ripley(const_holder) + const_holder.density = 1 + spawn() + del src + return + /datum/construction/mecha/ripley result = "/obj/mecha/working/ripley" @@ -300,6 +289,9 @@ list("key"="/obj/item/weapon/wrench")//14 ) + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + custom_action(step, atom/used_atom, mob/user) if(!..()) return 0 @@ -356,6 +348,18 @@ del used_atom return 1 + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + spawn_result() + var/obj/mecha_chassis/const_holder = holder + const_holder.construct = new /datum/construction/mecha/gygax(const_holder) + const_holder.density = 1 + spawn() + del src + return + + /datum/construction/mecha/gygax result = "/obj/mecha/combat/gygax" @@ -381,6 +385,9 @@ list("key"="/obj/item/weapon/wrench")//20 ) + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + custom_action(step, atom/used_atom, mob/user) if(!..()) return 0 @@ -452,6 +459,17 @@ del used_atom return 1 + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + spawn_result() + var/obj/mecha_chassis/const_holder = holder + const_holder.construct = new /datum/construction/mecha/firefighter(const_holder) + const_holder.density = 1 + spawn() + del src + return + /datum/construction/mecha/firefighter result = "/obj/mecha/working/firefighter" @@ -471,6 +489,10 @@ list("key"="/obj/item/weapon/wrench")//14 ) + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + + custom_action(step, atom/used_atom, mob/user) if(!..()) return 0 @@ -511,6 +533,92 @@ +/datum/construction/mecha/honker_chassis + result = "/obj/mecha_chassis/honker_full" + steps = list(list("key"="/obj/item/mecha_parts/part/honker_torso"),//1 + list("key"="/obj/item/mecha_parts/part/honker_left_arm"),//2 + list("key"="/obj/item/mecha_parts/part/honker_right_arm"),//3 + list("key"="/obj/item/mecha_parts/part/honker_left_leg"),//4 + list("key"="/obj/item/mecha_parts/part/honker_right_leg"),//5 + list("key"="/obj/item/mecha_parts/part/honker_head") + ) + + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.overlays += used_atom.icon_state+"+o" + del used_atom + return 1 + + spawn_result() + var/obj/mecha_chassis/const_holder = holder + const_holder.construct = new /datum/construction/mecha/honker(const_holder) + const_holder.density = 1 + spawn() + del src + return + + +/datum/construction/mecha/honker + result = "/obj/mecha/combat/honker" + steps = list(list("key"="/obj/item/weapon/bikehorn"),//1 + list("key"="/obj/item/clothing/shoes/clown_shoes"),//2 + list("key"="/obj/item/weapon/bikehorn"),//3 + list("key"="/obj/item/clothing/mask/gas/clown_hat"),//4 + list("key"="/obj/item/weapon/bikehorn"),//5 + list("key"="/obj/item/weapon/mousetrap"),//6 + list("key"="/obj/item/weapon/bikehorn"),//7 + list("key"="/obj/item/weapon/bananapeel"),//8 + list("key"="/obj/item/weapon/bikehorn"),//9 + list("key"="/obj/item/mecha_parts/circuitboard/honker/targeting"),//10 + list("key"="/obj/item/weapon/bikehorn"),//11 + list("key"="/obj/item/mecha_parts/circuitboard/honker/peripherals"),//12 + list("key"="/obj/item/weapon/bikehorn"),//13 + list("key"="/obj/item/mecha_parts/circuitboard/honker/main"),//14 + list("key"="/obj/item/weapon/bikehorn"),//15 + ) + + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + + custom_action(step, atom/used_atom, mob/user) + if(!..()) + return 0 + + if(istype(used_atom, /obj/item/weapon/bikehorn)) + playsound(holder, 'bikehorn.ogg', 50, 1) + user.visible_message("HONK!") + + //TODO: better messages. + switch(step) + if(14) + user.visible_message("[user] installs the central control module into [holder].", "You install the central control module into [holder].") + del used_atom + if(12) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + del used_atom + if(10) + user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + del used_atom + if(8) + user.visible_message("[user] installs the banana peel into hONK1 socket.", "You install the banana peel into the hONK1 socket.") + del used_atom + if(6) + user.visible_message("[user] installs the mousetrap into hONK2 socket.", "You install the mousetrap into hONK2 socket.") + del used_atom + if(4) + user.visible_message("[user] puts clown wig and mask on [holder].", "You put clown wig and mask on [holder].") + del used_atom + if(2) + user.visible_message("[user] puts clown boots on [holder].", "You put clown boots on [holder].") + del used_atom + return 1 + + + + ////////////////// misc //////////////// diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index a46a856cf47..b810fb70e98 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -26,6 +26,8 @@ var/tool = locate(href_list["select_tool"]) if(tool) src.selected_tool = tool + if (href_list["unlock_id_upload"]) + add_req_access = 1 if (href_list["add_req_access"]) if(!add_req_access) return var/access = text2num(href_list["add_req_access"]) @@ -78,6 +80,12 @@ else return ..() +/obj/mecha/working/get_commands() + var/output = {"Unlock ID upload panel
+ "} + output += ..() + return output + /obj/mecha/working/proc/output_access_dialog(obj/item/weapon/card/id/id_card, mob/user) if(!id_card || !user) return @@ -88,9 +96,9 @@ for(var/a in id_card.access) if(a in operation_req_access) continue var/a_name = get_access_desc(a) - if(!a_name) continue + if(!a_name) continue //there's some strange access without a name output += "[a_name] - Add
" - output += "
Finish" + output += "
Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)" output += "" user << browse(output, "window=exosuit_add_access") onclose(user, "exosuit_add_access") diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm index 849e5af5e8b..97eb26d25c3 100644 --- a/code/game/research/designs.dm +++ b/code/game/research/designs.dm @@ -378,6 +378,33 @@ datum materials = list("$glass" = 2000, "acid" = 20) build_path = "/obj/item/mecha_parts/circuitboard/gygax/targeting" + honker_main + name = "Circuit Design (\"H.O.N.K\" Central Control module)" + desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." + id = "honker_main" + req_tech = list("programming" = 2, "robotics" = 3) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/mecha_parts/circuitboard/honker/main" + + honker_peri + name = "Circuit Design (\"H.O.N.K\" Peripherals Control module)" + desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." + id = "honker_peri" + req_tech = list("programming" = 2, "robotics" = 3) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/mecha_parts/circuitboard/honker/peripherals" + + honker_targ + name = "Circuit Design (\"H.O.N.K\" Weapons & Targeting Control module)" + desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." + id = "honker_targ" + req_tech = list("programming" = 2, "robotics" = 3) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/mecha_parts/circuitboard/honker/targeting" + //////////////////////////////////////// //////////Disk Construction Disks/////// //////////////////////////////////////// diff --git a/icons/misc/mech_construct.dmi b/icons/misc/mech_construct.dmi index 2c7b30781a1af55f3b66bb8f2ece2670f699d61a..b0d3f5d8f5855ef51de97c7fcb926c31ce2916f7 100644 GIT binary patch delta 6590 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