diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index a7a3981c58..7c2fabbc9b 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -37,7 +37,7 @@ proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. var/list/L = steps[steps.len] - if(istype(used_atom, text2path(L["key"]))) + if(istype(used_atom, L["key"])) return steps.len return 0 @@ -47,7 +47,7 @@ proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one. for(var/i=1;i<=steps.len;i++) var/list/L = steps[i]; - if(istype(used_atom, text2path(L["key"]))) + if(istype(used_atom, L["key"])) if(custom_action(i, used_atom, user)) steps[i]=null;//stupid byond list from list removal... listclearnulls(steps); diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index e290fddf40..67391a1854 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -27,7 +27,7 @@ var/global/datum/getrev/revdata = new("config/svndir.txt") diary << "Unable to get [filename] contents, aborting" return abort() - var/list/CL = dd_text2list(text, "\n") + var/list/CL = tg_text2list(text, "\n") for (var/t in CL) if (!t) continue diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm new file mode 100644 index 0000000000..39967ecd5c --- /dev/null +++ b/code/datums/helper_datums/teleport.dm @@ -0,0 +1,170 @@ +//wrapper +/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) + new /datum/teleport/instant/science(arglist(args)) + return + +/datum/teleport + var/atom/movable/teleatom //atom to teleport + var/atom/destination //destination to teleport to + var/precision = 0 //teleport precision + var/datum/effect/effect/system/effectin //effect to show right before teleportation + var/datum/effect/effect/system/effectout //effect to show right after teleportation + var/soundin //soundfile to play before teleportation + var/soundout //soundfile to play after teleportation + var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) + + + New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) + ..() + if(!Init(arglist(args))) + return 0 + return 1 + + proc/Init(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout) + if(!setTeleatom(ateleatom)) + return 0 + if(!setDestination(adestination)) + return 0 + if(!setPrecision(aprecision)) + return 0 + setEffects(aeffectin,aeffectout) + setForceTeleport(afteleport) + setSounds(asoundin) + return 1 + + //must succeed + proc/setPrecision(aprecision) + if(isnum(aprecision)) + precision = aprecision + return 1 + return 0 + + //must succeed + proc/setDestination(atom/adestination) + if(istype(adestination)) + destination = adestination + return 1 + return 0 + + //must succeed in most cases + proc/setTeleatom(atom/movable/ateleatom) + if(istype(ateleatom, /obj/effect)) + del(ateleatom) + return 0 + if(istype(ateleatom)) + teleatom = ateleatom + return 1 + return 0 + + //custom effects must be properly set up first for instant-type teleports + //optional + proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null) + effectin = istype(aeffectin) ? aeffectin : null + effectout = istype(aeffectout) ? aeffectout : null + return 1 + + //optional + proc/setForceTeleport(afteleport) + force_teleport = afteleport + return 1 + + //optional + proc/setSounds(asoundin=null,asoundout=null) + soundin = isfile(asoundin) ? asoundin : null + soundout = isfile(asoundout) ? asoundout : null + return 1 + + //placeholder + proc/teleportChecks() + return 1 + + proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound) + if(location) + if(effect) + spawn(-1) + src = null + effect.attach(location) + effect.start() + if(sound) + spawn(-1) + src = null + playsound(location,sound,60,1) + return + + //do the monkey dance + proc/doTeleport() + + var/turf/destturf + var/turf/curturf = get_turf(teleatom) + if(precision) + var/list/posturfs = circlerangeturfs(destination,precision) + destturf = safepick(posturfs) + else + destturf = get_turf(destination) + + if(!destturf || !curturf) + return 0 + + playSpecials(curturf,effectin,soundin) + + if(force_teleport) + teleatom.loc.Exited(teleatom) + teleatom.loc = destturf + teleatom.loc.Entered(teleatom) + playSpecials(destturf,effectout,soundout) + else + if(teleatom.Move(destturf)) + playSpecials(destturf,effectout,soundout) + + return 1 + + proc/teleport() + if(teleportChecks()) + return doTeleport() + return 0 + +/datum/teleport/instant //teleports when datum is created + + New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) + if(..()) + teleport() + return + + +/datum/teleport/instant/science + + setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout) + if(!aeffectin || !aeffectout) + var/datum/effect/effect/system/spark_spread/aeffect = new + aeffect.set_up(5, 1, teleatom) + effectin = effectin || aeffect + effectout = effectout || aeffect + return 1 + else + return ..() + + setPrecision(aprecision) + ..() + if(istype(teleatom, /obj/item/weapon/storage/backpack/holding)) + precision = rand(1,100) + + var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding) + if(bagholding.len) + precision = max(rand(1,100)*bagholding.len,100) + if(istype(teleatom, /mob/living)) + var/mob/living/MM = teleatom + MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!" + return 1 + + teleportChecks() + if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite + teleatom.visible_message("\red The [teleatom] bounces off of the portal!") + return 0 + if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear))) + if(istype(teleatom, /mob/living)) + var/mob/living/MM = teleatom + MM.visible_message("\red The [MM] bounces off of the portal!","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.") + else + teleatom.visible_message("\red The [teleatom] bounces off of the portal!") + return 0 + return 1 \ No newline at end of file diff --git a/code/defines/atom.dm b/code/defines/atom.dm index f127596e36..151b81198a 100644 --- a/code/defines/atom.dm +++ b/code/defines/atom.dm @@ -91,6 +91,31 @@ obj return 1 return +/* + * atom/proc/search_contents_for(path,list/filter_path=null) + * Recursevly searches all atom contens (including contents contents and so on). + * + * ARGS: path - search atom contents for atoms of this type + * list/filter_path - if set, contents of atoms not of types in this list are excluded from search. + * + * RETURNS: list of found atoms + */ + +/atom/proc/search_contents_for(path,list/filter_path=null) + var/list/found = list() + for(var/atom/A in src) + if(istype(A, path)) + found += A + if(filter_path) + var/pass = 0 + for(var/type in filter_path) + pass |= istype(A, type) + if(!pass) + continue + if(A.contents.len) + found += A.search_contents_for(path,filter_path) + return found + /atom/movable/overlay/attackby(a, b) if (src.master) return src.master.attackby(a, b) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index a9a8c55b68..5f6378cfaf 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -111,11 +111,10 @@ return T /obj/machinery/teleport/hub/Bumped(M as mob|obj) - spawn( 0 ) + spawn() if (src.icon_state == "tele1") teleport(M) use_power(5000) - return return /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj) @@ -131,7 +130,7 @@ if(prob(5) && !accurate) //oh dear a problem, put em in deep space do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy - 5), 3), 2) else - do_teleport(M, com.locked, 0) //dead-on precision + do_teleport(M, com.locked) //dead-on precision else var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) @@ -139,7 +138,7 @@ for(var/mob/B in hearers(src, null)) B.show_message("\blue Test fire completed.") return - +/* /proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision) if(istype(M, /obj/effect)) del(M) @@ -224,7 +223,7 @@ s.set_up(5, 1, M) s.start() return - +*/ /obj/machinery/teleport/station/attackby(var/obj/item/weapon/W) src.attack_hand() diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index b0e1dac14e..ac3524da6a 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -12,7 +12,10 @@ /area/turret_protected/Entered(O) ..() + if(master && master != src) + return master.Entered(O) // world << "[O] entered[src.x],[src.y],[src.z]" + if (istype(O, /mob/living/carbon)) if (!(O in turretTargets)) turretTargets += O @@ -24,6 +27,8 @@ return 1 /area/turret_protected/Exited(O) + if(master && master != src) + return master.Exited(O) // world << "[O] exited [src.x],[src.y],[src.z]" if (istype(O, /mob)) if (!istype(O, /mob/living/silicon)) @@ -113,6 +118,8 @@ /obj/machinery/turret/proc/get_protected_area() var/area/turret_protected/TP = get_area(src) if(istype(TP)) + if(TP.master && TP.master != TP) + TP = TP.master return TP return @@ -189,7 +196,7 @@ /obj/machinery/turret/proc/shootAt(var/atom/movable/target) var/turf/T = get_turf(src) var/turf/U = get_turf(target) - if (!istype(T) || !istype(U)) + if (!T || !U) return var/obj/item/projectile/A if (src.lasers) @@ -287,7 +294,11 @@ /obj/machinery/turretid/New() ..() if(!control_area) - control_area = get_area(src) + var/area/CA = get_area(src) + if(CA.master && CA.master != CA) + control_area = CA.master + else + control_area = CA else if(istext(control_area)) for(var/area/A in world) if(A.name && A.name==control_area) @@ -395,7 +406,7 @@ var/projectiles = 100 var/projectiles_per_shot = 2 var/deviation = 0.3 - var/list/snapshot = list() + var/list/exclude = list() var/atom/cur_target var/scan_range = 7 var/health = 40 @@ -430,8 +441,7 @@ bullet_act(var/obj/item/projectile/Proj) - var/damage = Proj.damage - src.take_damage(damage) + src.take_damage(Proj.damage) ..() return @@ -468,7 +478,8 @@ src.on = !src.on if(src.on) spawn(50) - src.process() + if(src) + src.process() if(href_list["scan_range"]) src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8) if(href_list["scan_for"]) @@ -508,19 +519,24 @@ var/target = null if(scan_for["human"]) for(var/mob/living/carbon/human/M in oview(scan_range,src)) - if(!M.stat && !M.lying) - pos_targets += M + if(M.stat || M.lying || M in exclude) + continue + pos_targets += M if(scan_for["cyborg"]) for(var/mob/living/silicon/M in oview(scan_range,src)) - if(!M.stat && !M.lying) - pos_targets += M + if(M.stat || M.lying || M in exclude) + continue + pos_targets += M if(scan_for["mecha"]) for(var/obj/mecha/M in oview(scan_range, src)) + if(M in exclude) + continue pos_targets += M if(scan_for["alien"]) for(var/mob/living/carbon/alien/M in oview(scan_range,src)) - if(!M.stat && !M.lying) - pos_targets += M + if(M.stat || M.lying || M in exclude) + continue + pos_targets += M if(pos_targets.len) target = pick(pos_targets) return target diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index ff21096981..f1a36a3800 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -6,6 +6,7 @@ var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall) internal_damage_threshold = 50 maint_access = 0 + damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8) /* /obj/mecha/combat/verb/switch_weapon() diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index b80e5e70d2..964318a4c1 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -6,12 +6,13 @@ dir_in = 1 //Facing North. health = 400 deflect_chance = 20 + damage_absorption = list("brute"=0.4,"fire"=1.1,"bullet"=0.6,"laser"=0.85,"energy"=0.9,"bomb"=0.8) max_temperature = 3000 infra_luminosity = 8 force = 40 var/defence = 0 var/defence_deflect = 35 - wreckage = "/obj/effect/decal/mecha_wreckage/durand" + wreckage = /obj/effect/decal/mecha_wreckage/durand /* /obj/mecha/combat/durand/New() @@ -35,7 +36,7 @@ /obj/mecha/combat/durand/verb/defence_mode() set category = "Exosuit Interface" set name = "Toggle defence mode" - set src in view(0) + set src = usr.loc set popup_menu = 0 if(usr!=src.occupant) return diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 4a4fd6e84e..0cb3c89388 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -6,10 +6,11 @@ dir_in = 1 //Facing North. health = 300 deflect_chance = 15 + damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.6,"energy"=0.7,"bomb"=1) max_temperature = 3500 infra_luminosity = 6 var/overload = 0 - wreckage = "/obj/effect/decal/mecha_wreckage/gygax" + wreckage = /obj/effect/decal/mecha_wreckage/gygax internal_damage_threshold = 35 max_equip = 4 @@ -27,7 +28,7 @@ /obj/mecha/combat/gygax/verb/overload() set category = "Exosuit Interface" set name = "Toggle leg actuators overload" - set src in view(0) + set src = usr.loc set popup_menu = 0 if(usr!=src.occupant) return diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 3047b86b99..a874ec9805 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -6,10 +6,11 @@ health = 140 deflect_chance = 60 internal_damage_threshold = 60 + damage_absorption = list("brute"=1.2,"fire"=1.5,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1) max_temperature = 3500 infra_luminosity = 5 operation_req_access = list(access_clown) - wreckage = "/obj/effect/decal/mecha_wreckage/honker" + wreckage = /obj/effect/decal/mecha_wreckage/honker add_req_access = 0 max_equip = 3 var/squeak = 0 @@ -123,8 +124,8 @@ -/obj/mecha/combat/honker/relaymove(mob/user,direction) - var/result = ..() +/obj/mecha/combat/honker/mechstep(direction) + var/result = step(src,direction) if(result) if(!squeak) playsound(src, "clownstep", 70, 1) @@ -133,7 +134,6 @@ squeak = 0 return result - obj/mecha/combat/honker/Topic(href, href_list) ..() if (href_list["play_sound"]) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 1e6cc6dfdf..7b2c66b8b9 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -5,6 +5,7 @@ step_in = 5 health = 500 deflect_chance = 25 + damage_absorption = list("brute"=0.4,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7) max_temperature = 5000 infra_luminosity = 3 var/zoom = 0 @@ -14,7 +15,7 @@ var/smoke_cooldown = 100 var/datum/effect/effect/system/harmless_smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) - wreckage = "/obj/effect/decal/mecha_wreckage/marauder" + wreckage = /obj/effect/decal/mecha_wreckage/marauder add_req_access = 0 internal_damage_threshold = 25 force = 45 @@ -27,7 +28,7 @@ operation_req_access = list(access_cent_creed) step_in = 3 health = 550 - wreckage = "/obj/effect/decal/mecha_wreckage/seraph" + wreckage = /obj/effect/decal/mecha_wreckage/seraph internal_damage_threshold = 20 force = 55 max_equip = 5 @@ -37,11 +38,11 @@ name = "Mauler" icon_state = "mauler" operation_req_access = list(access_syndicate) - wreckage = "/obj/effect/decal/mecha_wreckage/mauler" + wreckage = /obj/effect/decal/mecha_wreckage/mauler /obj/mecha/combat/marauder/New() ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/pulse + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack ME.attach(src) @@ -97,12 +98,11 @@ var/tmp_step_energy_drain = step_energy_drain var/move_result = 0 if(internal_damage&MECHA_INT_CONTROL_LOST) - move_result = step_rand(src) + move_result = mechsteprand() else if(src.dir!=direction) - src.dir=direction - move_result = 1 + move_result = mechturn(direction) else - move_result = step(src,direction) + move_result = mechstep(direction) if(move_result) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) @@ -121,7 +121,7 @@ /obj/mecha/combat/marauder/verb/toggle_thrusters() set category = "Exosuit Interface" set name = "Toggle thrusters" - set src in view(0) + set src = usr.loc set popup_menu = 0 if(usr!=src.occupant) return @@ -136,7 +136,7 @@ /obj/mecha/combat/marauder/verb/smoke() set category = "Exosuit Interface" set name = "Smoke" - set src in view(0) + set src = usr.loc set popup_menu = 0 if(usr!=src.occupant) return @@ -151,7 +151,7 @@ /obj/mecha/combat/marauder/verb/zoom() set category = "Exosuit Interface" set name = "Zoom" - set src in view(0) + set src = usr.loc set popup_menu = 0 if(usr!=src.occupant) return diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index b441c76ead..2cb59a5591 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -7,9 +7,10 @@ step_energy_drain = 3 health = 200 deflect_chance = 30 + damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7) max_temperature = 1000 infra_luminosity = 3 - wreckage = "/obj/effect/decal/mecha_wreckage/phazon" + wreckage = /obj/effect/decal/mecha_wreckage/phazon add_req_access = 1 internal_damage_threshold = 25 force = 15 @@ -50,7 +51,7 @@ /obj/mecha/combat/phazon/verb/switch_damtype() set category = "Exosuit Interface" set name = "Change melee damage type" - set src in view(0) + set src = usr.loc set popup_menu = 0 if(usr!=src.occupant) return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index ea3f327030..9739c80994 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -50,6 +50,11 @@ del src return +/obj/item/mecha_parts/mecha_equipment/proc/critfail() + if(chassis) + chassis.log_message("Critical failure of component: [src]",1) + return + /obj/item/mecha_parts/mecha_equipment/proc/get_equip_info() if(!chassis) return return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]" @@ -70,6 +75,8 @@ return 0 if(!equip_ready) return 0 + if(crit_fail) + return 0 return 1 /obj/item/mecha_parts/mecha_equipment/proc/action(atom/target) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 035afd5c26..65f6a29f0e 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -401,7 +401,7 @@ /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "Armor Booster Module (Close Combat Weaponry)" - desc = "Boosts exosuit armor against armed melee attacks." + desc = "Boosts exosuit armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" origin_tech = "materials=3" equip_cooldown = 10 @@ -452,7 +452,7 @@ /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster name = "Armor Booster Module (Ranged Weaponry)" - desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots." + desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots. Requires energy to operate." icon_state = "mecha_abooster_proj" origin_tech = "materials=4" equip_cooldown = 10 @@ -493,7 +493,7 @@ chassis.visible_message("The [chassis.name] armor deflects the projectile") chassis.log_append_to_last("Armor saved.") else - chassis.take_damage(round(Proj.damage*src.damage_coeff)) + chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.flag) 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.use_power(energy_drain) @@ -558,9 +558,9 @@ return get_equip_info() - var/output = ..() - output += " - [pr_repair_droid.active()?"Dea":"A"]ctivate" - return output + if(!chassis) return + return "* [src.name] - [pr_repair_droid.active()?"Dea":"A"]ctivate" + Topic(href, href_list) ..() @@ -656,9 +656,8 @@ return get_equip_info() - var/output = ..() - output += " - [pr_energy_relay.active()?"Dea":"A"]ctivate" - return output + if(!chassis) return + return "* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate" proc/dynusepower(amount) if(!equip_ready) //enabled @@ -700,6 +699,139 @@ return + +/obj/item/mecha_parts/mecha_equipment/plasma_generator + name = "Plasma Converter" + desc = "Generates power using solid plasma as fuel. Pollutes the environment." + icon_state = "tesla" + origin_tech = "plasmatech=2;powerstorage=2;engineering" + equip_cooldown = 10 + energy_drain = 0 + range = MELEE + construction_cost = list("metal"=10000,"silver"=500,"glass"=1000) + var/datum/global_iterator/pr_mech_plasma_generator + var/coeff = 100 + var/fuel = 0 + var/max_fuel = 150000 + var/fuel_per_cycle_idle = 100 + var/fuel_per_cycle_active = 500 + var/power_per_cycle = 10 + reliability = 999 + + New() + ..() + pr_mech_plasma_generator = new /datum/global_iterator/mecha_plasma_generator(list(src),0) + pr_mech_plasma_generator.set_delay(equip_cooldown) + return + + detach() + pr_mech_plasma_generator.stop() + ..() + return + + + Topic(href, href_list) + ..() + if(href_list["toggle"]) + if(pr_mech_plasma_generator.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 = ..() + if(output) + return "[output] \[Plasma: [fuel] cm3\] - [pr_mech_plasma_generator.active()?"Dea":"A"]ctivate" + return + + action(target) + if(chassis) + var/result = load_fuel(target) + var/message + if(isnull(result)) + message = "Plasma traces in target minimal. [target] cannot be used as fuel." + else if(!result) + message = "Unit is full." + else + message = "[result] units of plasma successfully loaded." + send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) + chassis.occupant_message(message) + return + + proc/load_fuel(var/obj/item/stack/sheet/plasma/P) + if(istype(P) && P.amount) + var/to_load = max(max_fuel - fuel,0) + if(to_load) + var/units = min(max(round(to_load / P.perunit),1),P.amount) + if(units) + fuel += units * P.perunit + P.use(units) + return units + else + return 0 + return + + attackby(weapon,mob/user) + var/result = load_fuel(weapon) + if(isnull(result)) + user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","Plasma traces minimal. [weapon] cannot be used as fuel.") + else if(!result) + user << "Unit is full." + else + user.visible_message("[user] loads [src] with plasma.","[result] units of plasma successfully loaded.") + return + + critfail() + ..() + var/turf/simulated/T = get_turf(src) + var/datum/gas_mixture/GM = new + if(prob(10)) + GM.toxins += 100 + GM.temperature = 1500+T0C //should be enough to start a fire + T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.") + destroy() + else + GM.toxins += 5 + GM.temperature = istype(T) ? T.air.return_temperature() : T20C + T.assume_air(GM) + T.visible_message("The [src] suddenly disgorges a cloud of plasma.") + T.assume_air(GM) + return + +/datum/global_iterator/mecha_plasma_generator + + process(var/obj/item/mecha_parts/mecha_equipment/plasma_generator/EG) + if(!EG.chassis) + EG.set_ready_state(1) + return stop() + if(EG.fuel<=0) + EG.set_ready_state(1) + stop() + EG.chassis.log_message("[src] deactivated.") + send_byjax(EG.chassis.occupant,"exosuit.browser","\ref[EG]",EG.get_equip_info()) + return + if(rand(0,1000)>EG.reliability) + EG.critfail() + return stop() + var/cur_charge = EG.chassis.get_charge() + if(isnull(cur_charge)) + EG.set_ready_state(1) + EG.chassis.occupant_message("No powercell detected.") + EG.chassis.log_message("[src] deactivated.") + return stop() + var/use_fuel = EG.fuel_per_cycle_idle + if(cur_charge[src] beeps, \"Not enough resources. Queue processing stopped\".") + src.visible_message("\icon[src] [src] beeps, \"Not enough resources. Queue processing stopped\".") temp = {"Not enough resources to build next part.
Try again | Return"} return 0 remove_from_queue(1) build_part(part) part = listgetindex(src.queue, 1) - src.visible_message("[src] beeps, \"Queue processing finished successfully\".") + src.visible_message("\icon[src] [src] beeps, \"Queue processing finished successfully\".") return 1 proc/list_queue() @@ -361,7 +362,7 @@ temp += "Return" src.updateUsrDialog() if(i || tech_output) - src.visible_message("[src] beeps, \"Succesfully synchronized with R&D server. New data processed.\"") + src.visible_message("\icon[src] [src] beeps, \"Succesfully synchronized with R&D server. New data processed.\"") return proc/get_resource_cost_w_coeff(var/obj/item/mecha_parts/part as obj,var/resource as text, var/roundto=1) @@ -434,11 +435,13 @@ ..() var/datum/topic_input/filter = new /datum/topic_input(href,href_list) if(href_list["part_set"]) - if(href_list["part_set"]=="clear") - src.part_set = null - else - src.part_set = href_list["part_set"] - screen = "parts" + var/tpart_set = filter.getStr("part_set") + if(tpart_set) + if(tpart_set=="clear") + src.part_set = null + else + src.part_set = tpart_set + screen = "parts" if(href_list["part"]) var/list/part = filter.getObj("part") if(!processing_queue) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d05e458ba8..22d924fc5c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -25,6 +25,7 @@ var/step_energy_drain = 10 var/health = 300 //health is health var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) var/obj/item/weapon/cell/cell var/state = 0 var/list/log = new @@ -151,6 +152,7 @@ /obj/mecha/proc/range_action(atom/target) return + /* /obj/mecha/verb/test_int_damage() set name = "Test internal damage" @@ -196,12 +198,11 @@ return 0 var/move_result = 0 if(internal_damage&MECHA_INT_CONTROL_LOST) - move_result = step_rand(src) + move_result = mechsteprand() else if(src.dir!=direction) - src.dir=direction - move_result = 1 + move_result = mechturn(direction) else - move_result = step(src,direction) + move_result = mechstep(direction) if(occupant) for(var/obj/effect/speech_bubble/B in range(1, src)) if(B.parent == occupant) @@ -219,6 +220,24 @@ return 1 return 0 +/obj/mecha/proc/mechturn(direction) + dir = direction + playsound(src,'mechturn.ogg',40,1) + return 1 + +/obj/mecha/proc/mechstep(direction) + var/result = step(src,direction) + if(result) + playsound(src,'mechstep.ogg',40,1) + return result + +/obj/mecha/proc/mechsteprand() + var/result = step_rand(src) + if(result) + playsound(src,'mechstep.ogg',40,1) + return result + + /* /obj/mecha/proc/inertial_movement(direction) src.inertia_dir = direction @@ -271,16 +290,15 @@ /obj/mecha/proc/take_damage(amount, type="brute") if(amount) - switch(type) - if("brute") - src.health -= amount - if("fire") - amount *= 1.2 - src.health -= amount + var/damage = absorbDamage(amount,type) + src.health -= damage src.update_health() - src.log_append_to_last("Took [amount] points of damage. Damage type: \"[type]\".",1) + src.log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1) return +/obj/mecha/proc/absorbDamage(damage,damage_type) + return damage*(listgetindex(damage_absorption,damage_type) || 1) + /obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null) if(!islist(possible_int_damage) || isemptylist(possible_int_damage)) return if(prob(20)) @@ -288,13 +306,12 @@ for(var/T in possible_int_damage) if(internal_damage & T) possible_int_damage -= T - if(possible_int_damage) - var/int_dam_flag = pick(possible_int_damage) - if(int_dam_flag) - src.internal_damage |= int_dam_flag - src.pr_internal_damage.start() - src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1) - src.occupant << sound('warning-buzzer.ogg',wait=0) + var/int_dam_flag = safepick(possible_int_damage) + if(int_dam_flag) + src.internal_damage |= int_dam_flag + src.pr_internal_damage.start() + src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1) + src.occupant << sound('warning-buzzer.ogg',wait=0) if(prob(5)) if(ignore_threshold || src.health*100/initial(src.health) 10) + n = 10 + number = n + cardinals = c + location = loc + setup = 1 + + proc/attach(atom/atom) + holder = atom + + proc/start() + + ///////////////////////////////////////////// // GENERIC STEAM SPREAD SYSTEM @@ -86,44 +108,31 @@ steam.start() -- spawns the effect density = 0 /datum/effect/effect/system/steam_spread - var/number = 3 - var/cardinals = 0 - var/turf/location - var/atom/holder - -/datum/effect/effect/system/steam_spread/proc/set_up(n = 3, c = 0, turf/loc) - if(n > 10) - n = 10 - number = n - cardinals = c - location = loc - -/datum/effect/effect/system/steam_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/steam_spread/proc/start() - var/i = 0 - for(i=0, i 10) + n = 10 + number = n + cardinals = c + location = loc + start() + var/i = 0 + for(i=0, i 10) - n = 10 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - -/datum/effect/effect/system/spark_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/spark_spread/proc/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location) - src.total_sparks++ - var/direction - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 10) + n = 10 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + start() + var/i = 0 + for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location) + src.total_sparks++ + var/direction + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, i 10) - n = 10 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - - -/datum/effect/effect/system/harmless_smoke_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/harmless_smoke_spread/proc/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/harmless_smoke/smoke = new /obj/effect/effect/harmless_smoke(src.location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 10) + n = 10 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + if(direct) + direction = direct + start() + var/i = 0 + for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/harmless_smoke/smoke = new /obj/effect/effect/harmless_smoke(src.location) + src.total_smoke++ + var/direction = src.direction + if(!direction) + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, i 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct + set_up(n = 5, c = 0, loca, direct) + if(n > 20) + n = 20 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + if(direct) + direction = direct - -/datum/effect/effect/system/bad_smoke_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/bad_smoke_spread/proc/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/bad_smoke/smoke = new /obj/effect/effect/bad_smoke(src.location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/bad_smoke/smoke = new /obj/effect/effect/bad_smoke(src.location) + src.total_smoke++ + var/direction = src.direction + if(!direction) + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, i 20) - n = 20 - number = n - cardinals = c - carry.copy_to(chemholder, carry.total_volume) + set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct) + if(n > 20) + n = 20 + number = n + cardinals = c + carry.copy_to(chemholder, carry.total_volume) - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - - -/datum/effect/effect/system/chem_smoke_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/chem_smoke_spread/proc/start() - var/i = 0 - - // Calculate the smokes' color - var/list/rgbcolor = list(0,0,0) - var/finalcolor - for(var/datum/reagent/re in chemholder.reagents.reagent_list) - if(!finalcolor) - rgbcolor = GetColors(re.color) - finalcolor = re.color + if(istype(loca, /turf/)) + location = loca else - var/newcolor[3] - var/prergbcolor[3] - prergbcolor = rgbcolor - newcolor = GetColors(re.color) + location = get_turf(loca) + if(direct) + direction = direct - rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2 - rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2 - rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2 + start() + var/i = 0 - finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3]) - - if(finalcolor) - finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3]) // slightly darker color - - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/chem_smoke/smoke = new /obj/effect/effect/chem_smoke(src.location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - - if(chemholder.reagents.total_volume != 1) // can't split 1 very well - chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly - - if(finalcolor) - smoke.icon += finalcolor // give the smoke color, if it has any to begin with + // Calculate the smokes' color + var/list/rgbcolor = list(0,0,0) + var/finalcolor + for(var/datum/reagent/re in chemholder.reagents.reagent_list) + if(!finalcolor) + rgbcolor = GetColors(re.color) + finalcolor = re.color else - // if no color, just use the old smoke icon - smoke.icon = '96x96.dmi' - smoke.icon_state = "smoke" + var/newcolor[3] + var/prergbcolor[3] + prergbcolor = rgbcolor + newcolor = GetColors(re.color) - for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/chem_smoke/smoke = new /obj/effect/effect/chem_smoke(src.location) + src.total_smoke++ + var/direction = src.direction + if(!direction) + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + + if(chemholder.reagents.total_volume != 1) // can't split 1 very well + chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly + + if(finalcolor) + smoke.icon += finalcolor // give the smoke color, if it has any to begin with + else + // if no color, just use the old smoke icon + smoke.icon = '96x96.dmi' + smoke.icon_state = "smoke" + + for(i=0, i 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct + set_up(n = 5, c = 0, loca, direct) + if(n > 20) + n = 20 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + if(direct) + direction = direct -/datum/effect/effect/system/sleep_smoke_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/sleep_smoke_spread/proc/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/sleep_smoke/smoke = new /obj/effect/effect/sleep_smoke(src.location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/sleep_smoke/smoke = new /obj/effect/effect/sleep_smoke(src.location) + src.total_smoke++ + var/direction = src.direction + if(!direction) + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, i 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - -/datum/effect/effect/system/mustard_gas_spread/proc/attach(atom/atom) - holder = atom - -/datum/effect/effect/system/mustard_gas_spread/proc/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/mustard_gas/smoke = new /obj/effect/effect/mustard_gas(src.location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) + n = 20 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + if(direct) + direction = direct + start() + var/i = 0 + for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/mustard_gas/smoke = new /obj/effect/effect/mustard_gas(src.location) + src.total_smoke++ + var/direction = src.direction + if(!direction) + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, i 0) - devastation = min (MAX_EXPLOSION_RANGE, devastation + round(amount/12)) + start() + if (amount <= 2) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() - if (round(amount/6) > 0) - heavy = min (MAX_EXPLOSION_RANGE, heavy + round(amount/6)) + for(var/mob/M in viewers(5, location)) + M << "\red The solution violently explodes." + for(var/mob/M in viewers(1, location)) + if (prob (50 * amount)) + M << "\red The explosion knocks you down." + M.weakened += rand (1, 5) + return + else + var/devastation = -1 + var/heavy = -1 + var/light = -1 + var/flash = -1 - if (round(amount/3) > 0) - light = min (MAX_EXPLOSION_RANGE, light + round(amount/3)) + // Clamp all values to MAX_EXPLOSION_RANGE + if (round(amount/12) > 0) + devastation = min (MAX_EXPLOSION_RANGE, devastation + round(amount/12)) - if (flash && flashing_factor) - flash += (round(amount/4) * flashing_factor) + if (round(amount/6) > 0) + heavy = min (MAX_EXPLOSION_RANGE, heavy + round(amount/6)) - for(var/mob/M in viewers(8, location)) - M << "\red The solution violently explodes." + if (round(amount/3) > 0) + light = min (MAX_EXPLOSION_RANGE, light + round(amount/3)) - explosion(location, devastation, heavy, light, flash) \ No newline at end of file + if (flash && flashing_factor) + flash += (round(amount/4) * flashing_factor) + + for(var/mob/M in viewers(8, location)) + M << "\red The solution violently explodes." + + explosion(location, devastation, heavy, light, flash) \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 5cd027f891..2773409049 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -604,7 +604,15 @@ datum id = "mech_laser" build_type = MECHFAB req_tech = list("combat" = 3, "magnets" = 3) - build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/laser" + build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser" + + mech_laser_heavy + name = "Exosuit Weapon Design (CH-LC \"Solaris\" Laser Cannon)" + desc = "Allows for the construction of CH-LC Laser Cannon." + id = "mech_laser_heavy" + build_type = MECHFAB + req_tech = list("combat" = 4, "magnets" = 4) + build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy" mech_grenade_launcher name = "Exosuit Weapon Design (SGL-6 Grenade Launcher)" @@ -654,6 +662,14 @@ datum req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3) build_path = "/obj/item/mecha_parts/mecha_equipment/repair_droid" + mech_plasma_generator + name = "Exosuit Module Design (Plasma Converter Module)" + desc = "Exosuit-mounted plasma converter." + id = "mech_plasma_generator" + build_type = MECHFAB + req_tech = list("plasmatech" = 2, "powerstorage"= 2, "engineering" = 2) + build_path = "/obj/item/mecha_parts/mecha_equipment/plasma_generator" + //////////////////////////////////////// //////////Disk Construction Disks/////// //////////////////////////////////////// diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index fbe6ff2b1e..34ee129b99 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -77,6 +77,23 @@ research holder datum. else return 0 + //Checks to see if design has all the required pre-reqs. + //Input: datum/design; Output: 0/1 (false/true) + DesignHasReqs(var/datum/design/D) + if(D.req_tech.len == 0) + return 1 + var/matches = 0 + var/list/k_tech = list() + for(var/datum/tech/known in known_tech) + k_tech[known.id] = known.level + for(var/req in D.req_tech) + if(!isnull(k_tech[req]) && k_tech[req] >= D.req_tech[req]) + matches++ + if(matches == D.req_tech.len) + return 1 + else + return 0 +/* //Checks to see if design has all the required pre-reqs. //Input: datum/design; Output: 0/1 (false/true) DesignHasReqs(var/datum/design/D) @@ -92,7 +109,7 @@ research holder datum. return 1 else return 0 - +*/ //Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed. //Input: datum/tech; Output: Null AddTech2Known(var/datum/tech/T) diff --git a/html/changelog.html b/html/changelog.html index d63526c68a..a95d60b570 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -54,6 +54,19 @@ Stuff which is in development and not yet visible to players or just code relate (ie. code improvements for expandability, etc.) should not be listed here. They should be listed in the changelog upon commit tho. Thanks. --> +29 October 2011 +
    +
  • ConstantA updated: +
      +
    • Added step and turn sounds for mechs
    • +
    • Added another mecha equipment - plasma converter. Works similar to portable generator. Uses solid plasma as fuel. Can be refueled either by clicking on it with plasma in hand, or directly from mecha - selecting it and clicking on plasma.
    • +
    • Added mecha laser cannon.
    • +
    • Added damage absorption for mechs. Different mechs have different absorption for different types of damage.
    • +
    • Metal foam now blocks air movement.
    • +
    +
  • +
+ 29 October 2011
  • Petethegoat updated: diff --git a/sound/voice/critdestr.ogg b/sound/mecha/critdestr.ogg similarity index 100% rename from sound/voice/critdestr.ogg rename to sound/mecha/critdestr.ogg diff --git a/sound/voice/imag_enh.ogg b/sound/mecha/imag_enh.ogg similarity index 100% rename from sound/voice/imag_enh.ogg rename to sound/mecha/imag_enh.ogg diff --git a/sound/mecha/mechmove01.ogg b/sound/mecha/mechmove01.ogg new file mode 100644 index 0000000000..9a3ce595a8 Binary files /dev/null and b/sound/mecha/mechmove01.ogg differ diff --git a/sound/mecha/mechmove03.ogg b/sound/mecha/mechmove03.ogg new file mode 100644 index 0000000000..5eca39d8e9 Binary files /dev/null and b/sound/mecha/mechmove03.ogg differ diff --git a/sound/mecha/mechmove04.ogg b/sound/mecha/mechmove04.ogg new file mode 100644 index 0000000000..fab264aea5 Binary files /dev/null and b/sound/mecha/mechmove04.ogg differ diff --git a/sound/mecha/mechstep.ogg b/sound/mecha/mechstep.ogg new file mode 100644 index 0000000000..66540860df Binary files /dev/null and b/sound/mecha/mechstep.ogg differ diff --git a/sound/mecha/mechturn.ogg b/sound/mecha/mechturn.ogg new file mode 100644 index 0000000000..67dc345c02 Binary files /dev/null and b/sound/mecha/mechturn.ogg differ diff --git a/sound/voice/nominal.ogg b/sound/mecha/nominal.ogg similarity index 100% rename from sound/voice/nominal.ogg rename to sound/mecha/nominal.ogg diff --git a/sound/voice/weapdestr.ogg b/sound/mecha/weapdestr.ogg similarity index 100% rename from sound/voice/weapdestr.ogg rename to sound/mecha/weapdestr.ogg diff --git a/tgstation.dme b/tgstation.dme index 05e295dbb7..89451ee1ad 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -164,6 +164,7 @@ #define FILE_DIR "sound/effects" #define FILE_DIR "sound/items" #define FILE_DIR "sound/machines" +#define FILE_DIR "sound/mecha" #define FILE_DIR "sound/misc" #define FILE_DIR "sound/piano" #define FILE_DIR "sound/spells" @@ -239,6 +240,7 @@ #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\tension.dm" #include "code\datums\helper_datums\topic_input.dm" #include "code\datums\spells\area_teleport.dm"