From d14603b28af8df621761e225b380a24daa314c1f Mon Sep 17 00:00:00 2001 From: panurgomatic Date: Thu, 26 May 2011 18:28:33 +0000 Subject: [PATCH] - Reenabled phazom.dm, added phazon parts and construction path. - Added exosuit energy relay equipment. Uses area power (any power channel available) instead of powercell for movement and actions, recharges powercell. - Exosuits can be renamed. Command is in Permissions & Logging menu. - Lowered construction time for Ripley parts. - Exosuit wreckage can be salvaged for exosuit parts (torso, limbs etc). - Added .attack css style. Bold red text. - Bugfixes. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1620 316c924e-a436-60f5-8080-3fe189b3f50e --- code/datums/helper_datums/global_iterator.dm | 32 ++--- code/game/mecha/combat/gygax.dm | 2 +- code/game/mecha/combat/marauder.dm | 2 +- code/game/mecha/combat/phazon.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 3 +- code/game/mecha/equipment/tools/tools.dm | 137 ++++++++++++++++--- code/game/mecha/equipment/weapons/weapons.dm | 10 +- code/game/mecha/mech_bay.dm | 12 +- code/game/mecha/mecha.dm | 82 ++++++----- code/game/mecha/mecha_construction_paths.dm | 22 ++- code/game/mecha/mecha_parts.dm | 65 ++++++++- code/game/mecha/mecha_wreckage.dm | 90 ++++++++---- code/game/research/designs.dm | 2 +- code/stylesheet.dm | 6 + tgstation.dme | 1 + 15 files changed, 347 insertions(+), 121 deletions(-) diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index ba23e19530c..c5f6c6c5cbe 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -67,21 +67,22 @@ Data storage vars: return proc/main() - src.state = 1 + state = 1 while(src && control_switch) last_exec = world.timeofday if(check_for_null && has_null_args()) - src.stop() + spawn(-1) //don't wait for state_check() in stop() + stop() return 0 - result = src.process(arglist(arg_list)) - for(var/sleep_time=src.delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace. - if(!src.control_switch) + result = process(arglist(arg_list)) + for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace. + if(!control_switch) return 0 sleep(1) return 0 proc/start(list/arguments=null) - if(src.active()) + if(active()) return if(arguments) if(!set_process_args(arguments)) @@ -90,11 +91,11 @@ Data storage vars: return control_switch = 1 spawn() - src.state = src.main() + state = main() return 1 proc/stop() - if(!src.active()) + if(!active()) return control_switch = 0 if(!state_check()) @@ -103,11 +104,10 @@ Data storage vars: proc/state_check() var/lag = 0 - while(src.state) + while(state) sleep(1) if(++lag>10) - log_game("The global_iterator loop \ref[src] failed to terminate in designated timeframe. The supplied arguments were {[list2params(arg_list)]}") - return 0 + CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. Last exec - [get_last_exec_time_as_text()].") return 1 proc/process() @@ -144,12 +144,12 @@ Data storage vars: return 0 proc/toggle_null_checks() - src.check_for_null = !src.check_for_null - return src.check_for_null + check_for_null = !check_for_null + return check_for_null proc/toggle() - if(!src.stop()) - src.start() - return src.active() + if(!stop()) + start() + return active() diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index ab2e40f7c5e..8833ccc62c3 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -45,7 +45,7 @@ /obj/mecha/combat/gygax/relaymove(mob/user,direction) if(!..()) return if(overload) - cell.use(step_energy_drain) + use_power(step_energy_drain) health-- if(health < initial(health) - initial(health)/3) overload = 0 diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 00186c5031f..9fcddcf0a98 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -71,7 +71,7 @@ can_move = 0 spawn(tmp_step_in) can_move = 1 - cell.use(tmp_step_energy_drain) + use_power(tmp_step_energy_drain) return 1 return 0 diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 47648fee4ad..22b2d9a3729 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -32,7 +32,7 @@ can_move = 0 flick("phazon-phase", src) src.loc = get_step(src,src.dir) - src.cell.use(phasing_energy_drain) + src.use_power(phasing_energy_drain) sleep(step_in) can_move = 1 else diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index abc36112b63..f5cce35f4ef 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -104,5 +104,6 @@ /obj/item/mecha_parts/mecha_equipment/proc/set_ready_state(state) equip_ready = state - send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) + if(chassis) + send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) return diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 121de383e68..f8869ea6fbf 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -27,7 +27,7 @@ chassis.occupant_message("You lift [target] and start to load it into cargo compartment.") chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) O.anchored = 1 var/T = chassis.loc if(do_after_cooldown(target)) @@ -59,7 +59,7 @@ chassis.occupant_message("You push [target] out of the way.") chassis.visible_message("[chassis] pushes [target] out of the way.") set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_after_cooldown() return 1 @@ -73,10 +73,10 @@ action(atom/target) if(!action_checks(target)) return set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") chassis.occupant_message("You start to drill [target]") - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) var/T = chassis.loc if(do_after_cooldown(target)) if(T == chassis.loc && src == chassis.selected) @@ -191,7 +191,7 @@ chassis.spark_system.start() target:ReplaceWithFloor() playsound(target, 'Deconstruct.ogg', 50, 1) - chassis.cell.give(energy_drain) + chassis.give_power(energy_drain) else if (istype(target, /turf/simulated/floor)) chassis.occupant_message("Deconstructing [target]...") set_ready_state(0) @@ -200,7 +200,7 @@ chassis.spark_system.start() target:ReplaceWithSpace() playsound(target, 'Deconstruct.ogg', 50, 1) - chassis.cell.give(energy_drain) + chassis.give_power(energy_drain) else if (istype(target, /obj/machinery/door/airlock)) chassis.occupant_message("Deconstructing [target]...") set_ready_state(0) @@ -209,7 +209,7 @@ chassis.spark_system.start() del(target) playsound(target, 'Deconstruct.ogg', 50, 1) - chassis.cell.give(energy_drain) + chassis.give_power(energy_drain) if(1) if(istype(target, /turf/space)) chassis.occupant_message("Building Floor...") @@ -219,7 +219,7 @@ target:ReplaceWithFloor() playsound(target, 'Deconstruct.ogg', 50, 1) chassis.spark_system.start() - chassis.cell.use(energy_drain*3) + chassis.use_power(energy_drain*2) else if(istype(target, /turf/simulated/floor)) chassis.occupant_message("Building Wall...") set_ready_state(0) @@ -228,7 +228,7 @@ target:ReplaceWithWall() playsound(target, 'Deconstruct.ogg', 50, 1) chassis.spark_system.start() - chassis.cell.use(energy_drain*3) + chassis.use_power(energy_drain*2) if(2) if(istype(target, /turf/simulated/floor)) chassis.occupant_message("Building Airlock...") @@ -240,7 +240,7 @@ T.autoclose = 1 playsound(target, 'Deconstruct.ogg', 50, 1) playsound(target, 'sparks2.ogg', 50, 1) - chassis.cell.use(energy_drain*3) + chassis.use_power(energy_drain*2) return @@ -277,7 +277,7 @@ var/turf/T = get_turf(target) if(T) set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_teleport(chassis, T, 4) do_after_cooldown() return @@ -317,7 +317,7 @@ var/turf/target_turf = pick(L) if(!target_turf) return - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) set_ready_state(0) var/obj/portal/P = new /obj/portal(get_turf(target)) P.target = target_turf @@ -360,7 +360,7 @@ locked.throw_at(target, 14, 1.5) locked = null set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_after_cooldown() else chassis.occupant_message("Lock on [locked] disengaged.") @@ -380,7 +380,7 @@ step_away(A,target) sleep(2) set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_after_cooldown() return @@ -401,7 +401,7 @@ origin_tech = "materials=3" equip_cooldown = 10 energy_drain = 50 - range = RANGED + range = 0 construction_cost = list("metal"=20000,"silver"=5000) var/deflect_coeff = 1.15 var/damage_coeff = 0.8 @@ -436,7 +436,7 @@ chassis.take_damage(round(W.force*damage_coeff),W.damtype) chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_after_cooldown() return @@ -448,7 +448,7 @@ origin_tech = "materials=4" equip_cooldown = 10 energy_drain = 50 - range = RANGED + range = 0 construction_cost = list("metal"=20000,"gold"=5000) var/damage_coeff = 0.8 @@ -493,7 +493,7 @@ chassis.take_damage(round(damage*src.damage_coeff)) chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_after_cooldown() return @@ -513,19 +513,19 @@ chassis.take_damage(round(O.throwforce*damage_coeff)) chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) set_ready_state(0) - chassis.cell.use(energy_drain) + chassis.use_power(energy_drain) do_after_cooldown() return /obj/item/mecha_parts/mecha_equipment/repair_droid - name = "Exosuit Repair Droid" + name = "Repair Droid" desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost all types of external or internal damage." icon_state = "repair_droid" origin_tech = "magnets=3;programming=3" equip_cooldown = 20 energy_drain = 20 - range = RANGED + range = 0 construction_cost = list("metal"=10000,"gold"=1000,"silver"=2000,"glass"=5000) var/health_boost = 2 var/datum/global_iterator/pr_repair_droid @@ -579,6 +579,7 @@ process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj) if(!RD.chassis) + RD.set_ready_state(1) return src.stop() var/repaired = 0 if(RD.chassis.health < initial(RD.chassis.health)) @@ -598,12 +599,104 @@ RD.chassis.internal_damage &= ~MECHA_INT_CONTROL_LOST repaired = 1 if(repaired) - RD.chassis.cell.use(RD.energy_drain) + RD.chassis.use_power(RD.energy_drain) RD.set_ready_state(0) else RD.set_ready_state(1) return + +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay + name = "Energy Relay" + desc = "Wirelessly drains energy from any available power channel in area. The performance index is quite low." + icon_state = "mecha_equip" + origin_tech = "magnets=3" + equip_cooldown = 10 + energy_drain = 0 + range = 0 + construction_cost = list("metal"=10000,"gold"=5000,"silver"=5000,"glass"=2000) + var/datum/global_iterator/pr_energy_relay + var/coeff = 100 + + New() + ..() + pr_energy_relay = new /datum/global_iterator/mecha_energy_relay(list(src),0) + pr_energy_relay.set_delay(equip_cooldown) + return + + detach() + pr_energy_relay.stop() + chassis.proc_res["dynusepower"] = null + ..() + return + + attach(obj/mecha/M) + ..() + chassis.proc_res["dynusepower"] = src + return + + can_attach(obj/mecha/M) + if(..()) + if(!M.proc_res["dynusepower"]) + return 1 + return 0 + + Topic(href, href_list) + ..() + if(href_list["toggle_relay"]) + if(pr_energy_relay.toggle()) + set_ready_state(0) + chassis.log_message("[src] activated.") + else + set_ready_state(1) + chassis.log_message("[src] deactivated.") + return + + get_equip_info() + var/output = ..() + output += " - [pr_energy_relay.active()?"Dea":"A"]ctivate" + return output + + proc/dynusepower(amount) + if(equip_ready) //disabled + return chassis.dynusepower(amount) + var/area/A = get_area(chassis) + var/pow_chan + for(var/c in list(EQUIP,ENVIRON,LIGHT)) + if(A.master.powered(c)) + pow_chan = c + break + if(pow_chan) + A.master.use_power(amount*coeff, pow_chan) + return 1 + return 0 + +/datum/global_iterator/mecha_energy_relay + + process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER) + if(!ER.chassis) + ER.set_ready_state(1) + return stop() + var/cur_charge = ER.chassis.get_charge() + if(isnull(cur_charge)) + ER.set_ready_state(1) + ER.chassis.occupant_message("No powercell detected.") + return stop() + if(cur_charge= projectile_energy_cost && projectiles_to_add) projectiles++ projectiles_to_add-- - chassis.cell.use(projectile_energy_cost) + chassis.use_power(projectile_energy_cost) send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) chassis.log_message("Rearmed [src.name].") return diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index aef422f205c..7fb0c5e0462 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -6,10 +6,9 @@ var/obj/machinery/computer/mech_bay_power_console/recharge_console var/obj/mecha/recharging_mecha = null - Entered(atom as obj) + Entered(var/obj/mecha/mecha) . = ..() - if(istype(atom, /obj/mecha)) - var/obj/mecha/mecha = atom + if(istype(mecha)) mecha.occupant_message("Initializing power control devices.") init_devices() if(recharge_console && recharge_port) @@ -22,7 +21,7 @@ mecha.occupant_message("Power port not found. Terminating.") return - Exited(atom as obj) + Exited(atom) . = ..() if(atom == recharging_mecha) recharging_mecha = null @@ -105,12 +104,13 @@ /datum/global_iterator/mech_bay_recharger delay = 20 var/max_charge = 45 + check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process() process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha) - if(mecha in port.recharge_floor) + if(port && mecha && mecha in port.recharge_floor) var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge) if(delta>0) - mecha.cell.give(delta) + mecha.give_power(delta) port.use_power(delta*150) else mecha.occupant_message("Fully charged.") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 88f705c8666..49091986b64 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -89,11 +89,11 @@ src.verbs -= /obj/mecha/verb/disconnect_from_port src.verbs -= /atom/movable/verb/pull src.log_message("[src.name] created.") + src.loc.Entered(src) return /obj/mecha/Del() src.go_out() - src.loc.Exited(src) ..() return @@ -194,7 +194,7 @@ move_result = step(src,direction) if(move_result) can_move = 0 - cell.use(src.step_energy_drain) + use_power(step_energy_drain) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) src.pr_inertial_movement.start(list(src,direction)) @@ -401,7 +401,7 @@ if(PROJECTILE_LASER) damage = 20 if(PROJECTILE_TASER) - src.cell.use(500) + use_power(500) if(PROJECTILE_WEAKBULLET) damage = 8 if(PROJECTILE_BULLET) @@ -419,36 +419,31 @@ /obj/mecha/proc/destroy() spawn() - var/obj/mecha/mecha = src - // var/mob/M = src.occupant var/turf/T = get_turf(src) - var/wreckage = src.wreckage - var/list/r_equipment = src.equipment - var/obj/item/weapon/cell/r_cell = src.cell - var/obj/machinery/portable_atmospherics/canister/r_canister = src.internal_tank - src = null - del(mecha) + tag = "\ref[src]" //better safe then sorry + loc.Exited(src) + loc = null if(prob(40)) explosion(T, 0, 0, 1, 3) - spawn(0) - if(wreckage) - var/obj/decal/mecha_wreckage/WR = new wreckage(T) - for(var/obj/item/mecha_parts/mecha_equipment/E in r_equipment) - if(prob(30)) - WR.salvage += E - E.loc = WR - E.equip_ready = 1 - E.reliability = rand(30,100) - else - E.loc = T - E.destroy() - if(r_cell) - WR.salvage += r_cell - r_cell.loc = WR - r_cell.charge = rand(0, r_cell.charge) - if(r_canister) - WR.salvage += r_canister - r_canister.loc = WR + if(wreckage) + var/obj/decal/mecha_wreckage/WR = new wreckage(T) + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + if(prob(30)) + WR.crowbar_salvage += E + E.loc = WR + E.equip_ready = 1 + E.reliability = rand(30,100) + else + E.loc = T + E.destroy() + if(cell) + WR.crowbar_salvage += cell + cell.loc = WR + cell.charge = rand(0, cell.charge) + if(internal_tank) + WR.crowbar_salvage += internal_tank + internal_tank.loc = WR + del(src) return /obj/mecha/ex_act(severity) @@ -481,7 +476,8 @@ return ex_act(rand(1,3))//should do for now /obj/mecha/emp_act(severity) - cell.use(min(cell.charge, cell.maxcharge/severity)) + if(get_charge()) + use_power(min(cell.charge, cell.maxcharge/severity)) src.log_message("EMP detected") take_damage(100 / severity) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST),1) @@ -1108,6 +1104,7 @@ Unlock ID upload panel
DNA-lock
View internal log
+ Change exosuit name
[get_equipment_menu()]
@@ -1116,7 +1113,7 @@ "} return output -/obj/mecha/proc/get_equipment_menu() +/obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu var/output if(equipment.len) output += {"
@@ -1128,7 +1125,7 @@ output += "
" return output -/obj/mecha/proc/get_equipment_list() +/obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return var/output = "Equipment:
" @@ -1164,6 +1161,9 @@ src.occupant << browse(src.get_log_html(), "window=exosuit_log") onclose(occupant, "exosuit_log") return + if (href_list["change_name"]) + name = input(occupant,"Choose new exosuit name","Rename exosuit",initial(name)) + return if (href_list["repair_int_control_lost"]) src.occupant_message("Recalibrating coordination system.") src.log_message("Recalibration of coordination system started.") @@ -1281,6 +1281,22 @@ if(!src.cell) return return max(0, src.cell.charge) +/obj/mecha/proc/use_power(amount) + return call((proc_res["dynusepower"]||src), "dynusepower")(amount) + +/obj/mecha/proc/dynusepower(amount) + if(get_charge()>=amount) + cell.use(amount) + return 1 + return 0 + +/obj/mecha/proc/give_power(amount) + if(!isnull(get_charge())) + cell.give(amount) + return 1 + return 0 + + /obj/mecha/proc/output_access_dialog(obj/item/weapon/card/id/id_card, mob/user) if(!id_card || !user) return diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 30c3634bcd3..b9eea980d9b 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -743,4 +743,24 @@ user.visible_message("[user] secures Durand Armour Plates.", "You secure Durand Armour Plates.") if(1) user.visible_message("[user] welds Durand Armour Plates to [holder].", "You weld Durand Armour Plates to [holder].") - return 1 \ No newline at end of file + return 1 + + +/datum/construction/mecha/phazon_chassis + result = "/obj/mecha/combat/phazon" + steps = list(list("key"="/obj/item/mecha_parts/part/phazon_torso"),//1 + list("key"="/obj/item/mecha_parts/part/phazon_left_arm"),//2 + list("key"="/obj/item/mecha_parts/part/phazon_right_arm"),//3 + list("key"="/obj/item/mecha_parts/part/phazon_left_leg"),//4 + list("key"="/obj/item/mecha_parts/part/phazon_right_leg"),//5 + list("key"="/obj/item/mecha_parts/part/phazon_head") + ) + + 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 + + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) \ No newline at end of file diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 388c655f807..ef719854595 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -42,7 +42,7 @@ desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems." icon_state = "ripley_harness" origin_tech = "programming=2;materials=3;biotech=2" - construction_time = 300 + construction_time = 200 construction_cost = list("metal"=40000,"glass"=15000) /obj/item/mecha_parts/part/ripley_left_arm @@ -50,7 +50,7 @@ desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools." icon_state = "ripley_l_arm" origin_tech = "programming=2;materials=3" - construction_time = 200 + construction_time = 150 construction_cost = list("metal"=25000) /obj/item/mecha_parts/part/ripley_right_arm @@ -58,7 +58,7 @@ desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools." icon_state = "ripley_r_arm" origin_tech = "programming=2;materials=3" - construction_time = 200 + construction_time = 150 construction_cost = list("metal"=25000) /obj/item/mecha_parts/part/ripley_left_leg @@ -66,7 +66,7 @@ desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "ripley_l_leg" origin_tech = "programming=2;materials=3" - construction_time = 200 + construction_time = 150 construction_cost = list("metal"=30000) /obj/item/mecha_parts/part/ripley_right_leg @@ -74,7 +74,7 @@ desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "ripley_r_leg" origin_tech = "programming=2;materials=3" - construction_time = 200 + construction_time = 150 construction_cost = list("metal"=30000) ///////// Gygax @@ -278,6 +278,61 @@ construction_cost = list("metal"=20000,"bananium"=5000) +////////// Phazon + +/obj/item/mecha_parts/chassis/phazon + name = "Phazon Chassis" + origin_tech = "materials=7" + + New() + ..() + construct = new /datum/construction/mecha/phazon_chassis(src) + +/obj/item/mecha_parts/part/phazon_torso + name="Phazon Torso" + icon_state = "phazon_harness" + construction_time = 300 + construction_cost = list("metal"=35000,"glass"=10000,"plasma"=20000) + origin_tech = "programming=5;materials=7;bluespace=6;powerstorage=6" + +/obj/item/mecha_parts/part/phazon_head + name="Phazon Head" + icon_state = "phazon_head" + construction_time = 200 + construction_cost = list("metal"=15000,"glass"=5000,"plasma"=10000) + origin_tech = "programming=4;materials=5;magnets=6" + +/obj/item/mecha_parts/part/phazon_left_arm + name="Phazon Left Arm" + icon_state = "phazon_l_arm" + construction_time = 200 + construction_cost = list("metal"=20000,"plasma"=10000) + origin_tech = "materials=5;bluespace=2;magnets=2" + +/obj/item/mecha_parts/part/phazon_right_arm + name="Phazon Right Arm" + icon_state = "phazon_r_arm" + construction_time = 200 + construction_cost = list("metal"=20000,"plasma"=10000) + origin_tech = "materials=5;bluespace=2;magnets=2" + +/obj/item/mecha_parts/part/phazon_left_leg + name="Phazon Left Leg" + icon_state = "phazon_l_leg" + construction_time = 200 + construction_cost = list("metal"=20000,"plasma"=10000) + origin_tech = "materials=5;bluespace=3;magnets=3" + +/obj/item/mecha_parts/part/phazon_right_leg + name="Phazon Right Leg" + icon_state = "phazon_r_leg" + construction_time = 200 + construction_cost = list("metal"=20000,"plasma"=10000) + origin_tech = "materials=5;bluespace=3;magnets=3" + + +///////// Circuitboards + /obj/item/mecha_parts/circuitboard name = "Exosuit Circuit board" icon = 'module.dmi' diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index bc63f86c9bd..a408a22c974 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -10,16 +10,14 @@ density = 1 anchored = 1 opacity = 0 - var/list/welder_salvage = list("/obj/item/stack/sheet/r_metal","/obj/item/stack/sheet/metal","/obj/item/stack/rods") - var/list/wirecutters_salvage = list("/obj/item/weapon/cable_coil") - var/list/crowbar_salvage = list("/obj/item/weapon/cell") - var/list/equipment = new + var/list/welder_salvage = list(/obj/item/stack/sheet/r_metal,/obj/item/stack/sheet/metal,/obj/item/stack/rods) + var/list/wirecutters_salvage = list(/obj/item/weapon/cable_coil) + var/list/crowbar_salvage var/salvage_num = 5 - var/list/salvage New() ..() - salvage = new + crowbar_salvage = new return /obj/decal/mecha_wreckage/ex_act(severity) @@ -31,53 +29,43 @@ /obj/decal/mecha_wreckage/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/weldingtool) && W:welding) if(salvage_num <= 0) - user << "You can't see anything of value left on this wreck." + user << "You don't see anything that can be cut with [W]." return - if (W:remove_fuel(0,user)) + if (!isemptylist(welder_salvage) && W:remove_fuel(0,user)) var/type = prob(70)?pick(welder_salvage):null if(type) var/N = new type(get_turf(user)) user.visible_message("[user] cuts [N] from [src]", "You cut [N] from [src]", "You hear a sound of welder nearby") + if(istype(N, /obj/item/mecha_parts/part)) + welder_salvage -= N + salvage_num-- else user << "You failed to salvage anything valuable from [src]." - salvage_num-- else user << "\blue You need more welding fuel to complete this task." return if(istype(W, /obj/item/weapon/wirecutters)) if(salvage_num <= 0) - user << "You can't see anything of value left on this wreck." + user << "You don't see anything that can be cut with [W]." return - else + else if(!isemptylist(wirecutters_salvage)) var/type = prob(70)?pick(wirecutters_salvage):null if(type) var/N = new type(get_turf(user)) user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") + salvage_num-- else user << "You failed to salvage anything valuable from [src]." - salvage_num-- if(istype(W, /obj/item/weapon/crowbar)) - if(salvage.len) - var/obj/S = pick(salvage) + if(!isemptylist(crowbar_salvage)) + var/obj/S = pick(crowbar_salvage) if(S) S.loc = get_turf(user) - salvage -= S + crowbar_salvage -= S user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") return - if(salvage_num<=0) - user << "You can't see anything of value left on this wreck." - return else - var/type = prob(70)?pick(crowbar_salvage):null - if(type) - var/N = new type(get_turf(user)) - if(istype(N, /obj/item/weapon/cell)) - N:maxcharge = rand(5000,12000) - N:charge = 0 - user.visible_message("[user] pries [N] from [src].", "You pry [N] from [src].") - else - user << "You failed to salvage anything from [src]." - salvage_num-- + user << "You don't see anything that can be pried with [W]." else ..() return @@ -87,6 +75,22 @@ name = "Gygax wreckage" icon_state = "gygax-broken" + New() + ..() + var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso, + /obj/item/mecha_parts/part/gygax_head, + /obj/item/mecha_parts/part/gygax_left_arm, + /obj/item/mecha_parts/part/gygax_right_arm, + /obj/item/mecha_parts/part/gygax_left_leg, + /obj/item/mecha_parts/part/gygax_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return + + /obj/decal/mecha_wreckage/marauder name = "Marauder wreckage" @@ -97,11 +101,41 @@ name = "Ripley wreckage" icon_state = "ripley-broken" + New() + ..() + var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return + /obj/decal/mecha_wreckage/durand name = "Durand wreckage" icon_state = "durand-broken" + New() + ..() + var/list/parts = list( + /obj/item/mecha_parts/part/durand_torso, + /obj/item/mecha_parts/part/durand_head, + /obj/item/mecha_parts/part/durand_left_arm, + /obj/item/mecha_parts/part/durand_right_arm, + /obj/item/mecha_parts/part/durand_left_leg, + /obj/item/mecha_parts/part/durand_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return + /obj/decal/mecha_wreckage/phazon name = "Phazon wreckage" icon_state = "phazon-broken" diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm index 6d5f24842da..09d73db01ae 100644 --- a/code/game/research/designs.dm +++ b/code/game/research/designs.dm @@ -34,7 +34,7 @@ other types of metals and chemistry for reagents). #define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals #define AUTOLATHE 4 //Uses glass/metal only. #define CRAFTLATHE 8 //Uses fuck if I know. For use eventually. -#define MECHFAB 16 +#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars. //Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. datum diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 559b5c14237..f973a4d2dee 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -111,4 +111,10 @@ h1.alert, h2.alert { color: #000000; } + +.attack +{ + font-weight: bold; + color: #f00; +} "} diff --git a/tgstation.dme b/tgstation.dme index 6e91efef6fd..0b5b335ebb0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -447,6 +447,7 @@ #include "code\game\mecha\combat\gygax.dm" #include "code\game\mecha\combat\honker.dm" #include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" #include "code\game\mecha\equipment\mecha_equipment.dm" #include "code\game\mecha\equipment\tools\tools.dm" #include "code\game\mecha\equipment\weapons\weapons.dm"