diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 57f03e4b76..2f2be8cc46 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -118,6 +118,9 @@ /obj/item/weapon/circuitboard/rdconsole name = "Circuit Board (RD Console)" build_path = "/obj/machinery/computer/rdconsole" +/obj/item/weapon/circuitboard/mecha_control + name = "Circuit Board (Exosuit Control Console)" + build_path = "/obj/machinery/computer/mecha" diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 7f0aee39cd..346e3156f5 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -85,8 +85,11 @@ istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) usr << "\red You don't have the dexterity to do this!" return 1 +/* + //distance checks are made by atom/proc/DblClick if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon)) return 1 +*/ if (ishuman(user)) if(user.brainloss >= 60) for(var/mob/M in viewers(src, null)) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 8dcc863f18..82bf9d2001 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -416,4 +416,185 @@ var/area/area = loc for (var/obj/machinery/turret/aTurret in get_area_all_atoms(area)) - aTurret.setState(enabled, lethal) \ No newline at end of file + aTurret.setState(enabled, lethal) + + + +/obj/turret/gun_turret + name = "Gun Turret" + density = 1 + anchored = 1 + var/cooldown = 20 + var/projectiles = 100 + var/projectiles_per_shot = 2 + var/deviation = 0.3 + var/list/snapshot = list() + var/atom/cur_target + var/scan_range = 7 + var/health = 40 + var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1) + var/on = 0 + icon = 'turrets.dmi' + icon_state = "gun_turret" + + + ex_act() + del src + return + + emp_act() + del src + return + + meteorhit() + del src + return + + proc/update_health() + if(src.health<=0) + del src + return + + proc/take_damage(damage) + src.health -= damage + if(src.health<=0) + del src + return + + bullet_act(flag) + var/damage = 0 + switch(flag) + if(PROJECTILE_PULSE) + damage = 40 + if(PROJECTILE_LASER) + damage = 20 + if(PROJECTILE_TASER) + damage = 8 + if(PROJECTILE_WEAKBULLET) + damage = 8 + if(PROJECTILE_BULLET) + damage = 10 + if(PROJECTILE_BOLT) + damage = 5 + if(PROJECTILE_DART) + damage = 5 + src.take_damage(damage) + return + + attack_hand(mob/user as mob) + user.machine = src + var/dat = {" + [src] Control + + Power: [on?"on":"off"]
+ Scan Range: - [scan_range] +
+ Scan for: "} + for(var/scan in scan_for) + dat += "
[scan] ([scan_for[scan]?"Yes":"No"])
" + + dat += {"Ammo: [max(0, projectiles)]
+ + "} + user << browse(dat, "window=turret") + onclose(user, "turret") + return + + attack_ai(mob/user as mob) + return attack_hand(user) + + + attack_alien(mob/user as mob) + user.visible_message("[user] slashes at [src]", "You slash at [src]") + src.take_damage(15) + return + + Topic(href, href_list) + if(href_list["power"]) + src.on = !src.on + if(src.on) + spawn(50) + 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"]) + if(href_list["scan_for"] in scan_for) + scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]] + src.updateUsrDialog() + return + + + proc/validate_target(atom/target) + if(get_dist(target, src)>scan_range) + return 0 + if(istype(target, /mob)) + var/mob/M = target + if(!M.stat && !M.lying)//ninjas can't catch you if you're lying + return 1 + else if(istype(target, /obj/mecha)) + return 1 + return 0 + + + proc/process() + spawn while(on) + if(projectiles<=0) + on = 0 + return + if(cur_target && !validate_target(cur_target)) + cur_target = null + if(!cur_target) + cur_target = get_target() + fire(cur_target) + sleep(cooldown) + return + + proc/get_target() + var/list/pos_targets = list() + 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(scan_for["cyborg"]) + for(var/mob/living/silicon/M in oview(scan_range,src)) + if(!M.stat && !M.lying) + pos_targets += M + if(scan_for["mecha"]) + for(var/obj/mecha/M in oview(scan_range, src)) + 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(pos_targets.len) + target = pick(pos_targets) + return target + + + proc/fire(atom/target) + if(!target) + cur_target = null + return + src.dir = get_dir(src,target) + var/turf/targloc = get_turf(target) + var/target_x = targloc.x + var/target_y = targloc.y + var/target_z = targloc.z + targloc = null + spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) + if(!src) break + var/turf/curloc = get_turf(src) + targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z) + if (!targloc || !curloc) + continue + if (targloc == curloc) + continue + playsound(src, 'Gunshot.ogg', 50, 1) + var/obj/bullet/A = new /obj/bullet(curloc) + src.projectiles-- + A.current = curloc + A.yo = targloc.y - curloc.y + A.xo = targloc.x - curloc.x + A.process() + sleep(2) + return \ No newline at end of file diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index fa88be0104..8ab1c8ac45 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -42,6 +42,7 @@ else deflect_chance = initial(deflect_chance) src.occupant_message("You disable [src] defence mode.") + src.log_message("Toggled defence mode.") return @@ -51,8 +52,7 @@ return output /obj/mecha/combat/durand/get_commands() - var/output = {"Toggle defence mode
- "} + var/output = "Toggle defence mode
" output += ..() return output diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index f74e6eb903..c4812e5ae3 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -33,6 +33,7 @@ overload = 1 step_in = min(1, round(step_in/2)) src.occupant_message("You enable leg actuators overload.") + src.log_message("Toggled leg actuators overload.") return @@ -55,8 +56,7 @@ return output /obj/mecha/combat/gygax/get_commands() - var/output = {"Toggle leg actuators overload
- "} + var/output = "Toggle leg actuators overload

" output += ..() return output diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 3fe7dd80a0..23dae30efb 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -129,9 +129,8 @@ /obj/mecha/combat/marauder/get_commands() var/output = {"Toggle thrusters
Toggle zoom mode
- Smoke
-
- "} + Smoke +
"} output += ..() return output diff --git a/code/game/mecha/combat/weapons/weapons.dm b/code/game/mecha/combat/weapons/weapons.dm index a83798866b..a40c7d4172 100644 --- a/code/game/mecha/combat/weapons/weapons.dm +++ b/code/game/mecha/combat/weapons/weapons.dm @@ -397,4 +397,6 @@ spawn(weapon_cooldown) weapon_ready = 1 chassis.log_message("Fired from [src.name], targeting [target].") - return \ No newline at end of file + return + + diff --git a/code/game/mecha/global_iterator.dm b/code/game/mecha/global_iterator.dm index 4355e9bc73..026d85f279 100644 --- a/code/game/mecha/global_iterator.dm +++ b/code/game/mecha/global_iterator.dm @@ -67,8 +67,7 @@ Data storage vars: while(src && control_switch) last_exec = world.timeofday if(check_for_null && has_null_args()) - src.stop() - break + return src.stop() result = src.process(arglist(arg_list)) sleep(delay) return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index c2c8c6407b..e92f4c5ad0 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -9,10 +9,11 @@ name = "Exosuit Fabricator" density = 1 anchored = 1 - layer=2 use_power = 1 idle_power_usage = 20 active_power_usage = 5000 + var/time_coeff = 1 //can be upgraded with research + var/resource_coeff = 1.5 //can be upgraded with research var/list/resources = list( "metal"=20000, "glass"=20000, @@ -64,7 +65,8 @@ 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), - ) + ), + "Misc"=list(list("result"="/obj/item/mecha_tracking","time"=30,"metal"=500)) ) @@ -128,9 +130,9 @@ var/i = 0 for(var/p in part) if(p in resources) - cost += "[i?" | ":null][part[p]] [p]" + cost += "[i?" | ":null][part[p]*resource_coeff] [p]" i++ - var/output = "[O.name] ([cost]) [part["time"]/10]sec" + var/output = "[O.name] ([cost]) [part["time"]*time_coeff/10]sec" del O return output @@ -143,13 +145,13 @@ proc/remove_resources(part) for(var/p in part) if(p in resources) - src.resources[p] -= part[p] + src.resources[p] -= part[p]*resource_coeff return proc/check_resources(part) for(var/p in part) if(p in resources) - if(src.resources[p] < part[p]) + if(src.resources[p] < part[p]*resource_coeff) return 0 return 1 @@ -205,7 +207,233 @@ src.remove_resources(part) src.icon_state = "mechfab3" //looks better than 'flick' src.use_power = 2 - spawn(time) + spawn(time*time_coeff) + 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() + return + + process() + if (stat & (NOPOWER|BROKEN)) + return + + attackby(obj/item/stack/sheet/W as obj, mob/user as mob) + var/material + if(istype(W, /obj/item/stack/sheet/gold)) + material = "gold" + else if(istype(W, /obj/item/stack/sheet/silver)) + material = "silver" + else if(istype(W, /obj/item/stack/sheet/diamond)) + material = "diamond" + else if(istype(W, /obj/item/stack/sheet/plasma)) + material = "plasma" + else if(istype(W, /obj/item/stack/sheet/metal)) + material = "metal" + else if(istype(W, /obj/item/stack/sheet/glass)) + material = "glass" + else if(istype(W, /obj/item/stack/sheet/clown)) + material = "bananium" + else + return ..() + + if(src.being_built) + user << "The fabricator is currently processing. Please wait until completion." + return + + var/name = "[W.name]" + var/amnt = W.perunit + if(src.resources[material] < res_max_amount) + var/count = 0 + spawn(10) + if(W && W.amount) + while(src.resources[material] < res_max_amount && W) + src.resources[material] += amnt + W.use(1) + count++ + flick("mechfab2", src) + user << "You insert [count] [name] into the fabricator." + src.updateUsrDialog() + else + user << "The fabricator cannot hold more [name]." + return + +/* +/obj/machinery/mecha_part_fabricator_wip + icon = 'stationobjs.dmi' + icon_state = "mechfab1" + name = "Exosuit Fabricator" + density = 1 + anchored = 1 + layer=2 + use_power = 1 + idle_power_usage = 20 + active_power_usage = 5000 + var/time_coeff = 2 //can be upgraded with research + var/resource_coeff = 1.5 //can be upgraded with research + var/list/resources = list( + "/obj/item/stack/sheet/metal"=20000, + + ) + var/res_max_amount = 200000 + var/part_set + var/obj/being_built + var/list/part_sets = list( //set names must be unique + "Ripley"=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" + ) + ) + + New() + ..() + for(var/part_set in part_sets) + var/list/parts = part_sets[part_set] + for(var/i;i<=parts.len;i++) + parts[i]=new text2path(parts[i])(src) + return + + + proc/add_part_set(set_name,parts=null) + if(set_name in part_sets)//attempt to create duplicate set + return 0 + if(isnull(parts)) + part_sets[set_name] = list() + else + part_sets[set_name] = parts + return 1 + + proc/add_part_to_set(set_name,part) + src.add_part_set(set_name)//if no "set_name" set exists, create + var/list/part_set = part_sets[set_name] + part_set[++part_set.len] = part + return + + proc/remove_part_set(set_name) + for(var/i=1,i<=part_sets.len,i++) + if(part_sets[i]==set_name) + part_sets.Cut(i,++i) + return + + proc/sanity_check() + for(var/p in resources) + var/index = resources.Find(p) + index = resources.Find(p, ++index) + if(index) //duplicate resource + world << "Duplicate resource definition for [src](\ref[src])" + return 0 + for(var/set_name in part_sets) + var/index = part_sets.Find(set_name) + index = part_sets.Find(set_name, ++index) + if(index) //duplicate part set + world << "Duplicate part set definition for [src](\ref[src])" + return 0 + return 1 +/* + New() + ..() + src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000)) + src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/ripley_left_arm","time"=200,"metal"=25000)) + src.remove_part_set("Gygax") + return +*/ + + proc/output_parts_list(set_name) + var/output = "" + if(set_name in part_sets) + var/list/part_set = part_sets[set_name] + for(var/part in part_set) + var/resources_available = check_resources(part) + output += "[resources_available?"":""][output_part_info(part)][resources_available?"":""]
" + return output + + proc/output_part_info(var/obj/item/mecha_parts/part) + var/cost = "Cost: " + var/i = 0 + for(var/resource in part.construction_cost) + cost += "[i?" | ":null][part[p]*resource_coeff] [p]" + i++ + var/output = "[O.name] ([cost]) [part["time"]*time_coeff/10]sec" + del O + return output + + proc/output_available_resources() + var/output + for(var/resource in resources) + output += "[resource]: [min(res_max_amount, resources[resource])] cm3
" + return output + + proc/remove_resources(var/obj/item/mecha_parts/part) + for(var/resource in part.construction_cost) + src.resources[resource] -= part.construction_cost[resource]*resource_coeff + return + + proc/check_resources(var/obj/item/mecha_parts/part) + for(var/resource in part.construction_cost) + if(resource in src.resources) + if(src.resources[resource] < part.construction_cost[resource]*resource_coeff) + return 0 + return 1 + + attack_hand(mob/user as mob) + var/dat + if (..()) + return + user.machine = src + if (src.being_built) + dat = {"Building [src.being_built.name].
+ Please wait until completion...

+
+ "} + else + dat = output_available_resources() + dat += "
" + if(!part_set) + for(var/part_set in part_sets) + dat += "[part_set]
" + else + dat += output_parts_list(part_set) + dat += "
Return" + + user << browse({" + + +[src.name] + + +[dat] + + "}, "window=mecha_fabricator") + onclose(user, "mecha_fabricator") + return + + + Topic(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"] + if(href_list["part"]) + var/list/part = locate(href_list["part"]) + if(!part) return + var/path = part["result"] + var/time = part["time"] + src.being_built = new path(src) + src.remove_resources(part) + src.icon_state = "mechfab3" //looks better than 'flick' + src.use_power = 2 + spawn(time*time_coeff) src.use_power = 1 src.being_built.Move(get_step(src,EAST)) src.icon_state = initial(src.icon_state) @@ -225,25 +453,25 @@ var/amnt if(istype(W, /obj/item/stack/sheet/gold)) material = "gold" - amnt = W:perunit + amnt = "g_amt" else if(istype(W, /obj/item/stack/sheet/silver)) material = "silver" - amnt = W:perunit + amnt = "g_amt" else if(istype(W, /obj/item/stack/sheet/diamond)) material = "diamond" - amnt = W:perunit + amnt = "g_amt" else if(istype(W, /obj/item/stack/sheet/plasma)) material = "plasma" - amnt = W:perunit + amnt = "g_amt" else if(istype(W, /obj/item/stack/sheet/metal)) material = "metal" - amnt = W:perunit + amnt = "m_amt" else if(istype(W, /obj/item/stack/sheet/glass)) material = "glass" - amnt = W:perunit + amnt = "g_amt" else if(istype(W, /obj/item/stack/sheet/clown)) material = "bananium" - amnt = W:perunit + amnt = "g_amt" else return ..() @@ -252,12 +480,13 @@ return var/name = "[W.name]" + var/type = "[W.type]" if(src.resources[material] < res_max_amount) var/count = 0 spawn(10) if(W && W.amount) - while(src.resources[material] < res_max_amount && W) - src.resources[material] += amnt + while(src.resources[type] < res_max_amount && W) + src.resources[type] += W.vars[amnt] W.use(1) count++ flick("mechfab2", src) @@ -266,3 +495,4 @@ else user << "The fabricator cannot hold more [name]." return +*/ diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index dc3b97b25f..b55f39fa82 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -90,39 +90,71 @@ if(mech_click == world.time) return mech_click = world.time */ + if(!istype(object, /atom)) return 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 -// sleep(-1) spawn() //this helps prevent clickspam fest. - Mech.click_action(object) + Mech.click_action(object,M) else return ..() -/obj/mecha/proc/click_action(atom/target) -// if(!istype(target,/turf) && !istype(target.loc,/turf)) return - if(!src.occupant) return +/obj/mecha/proc/click_action(atom/target,mob/user) + if(!src.occupant || src.occupant != user ) return + if(user.stat) return if(state || !cell || cell.charge<=0) return if(src == target) return var/dir_to_target = get_dir(src,target) - if(dir_to_target && !(get_dir(src,target) & src.dir))//wrong direction + if(dir_to_target && !(dir_to_target & src.dir))//wrong direction return - if(get_dist(src,target)<=1) - src.melee_action(target) - else + if(get_dist(src,target)>1) src.range_action(target) + else + src.melee_action(target) return /obj/mecha/proc/melee_action(atom/target) - return +/* + if(istype(target, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/A = target + if(A.locked) + src.occupant_message("Unable to open airlock - bolted") + return 0 + else if(src.density && !src.welded && !src.operating) && ((!src.arePowerSystemsOn()) || (stat & NOPOWER))) + if(src.arePowerSystemsOn() && !(stat&NOPOWER)) + A.open() + else + spawn(0) + src.operating = 1 + animate("opening") + sleep(15) + src.density = 0 + update_icon() + if (!istype(src, /obj/machinery/door/airlock/glass)) + src.sd_SetOpacity(0) + src.operating = 0 + return 0 + else if(!src.density && !src.welded && !src.operating) + if(src.arePowerSystemsOn() && !(stat&NOPOWER)) + A.close() + else + spawn( 0 ) + src.operating = 1 + animate("closing") + src.density = 1 + sleep(15) + update_icon() + if ((src.visible) && (!istype(src, /obj/machinery/door/airlock/glass))) + src.sd_SetOpacity(1) + src.operating = 0 + return 0 +*/ + return 1 /obj/mecha/proc/range_action(atom/target) return @@ -144,7 +176,7 @@ ////////////////////////////////// /obj/mecha/relaymove(mob/user,direction) - if(!can_move) + if(!can_move || user != src.occupant) return 0 if(connected_port) src.occupant_message("Unable to move while connected to the air system port") @@ -230,7 +262,7 @@ /obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)//TODO if(!src) return - if(prob(40)) + if(prob(25)) if(ignore_threshold || src.health*100/initial(src.health)LIFE SUPPORT SYSTEM MALFUNCTION
":null] [internal_damage&MECHA_INT_TANK_BREACH?"GAS TANK BREACH
":null] [internal_damage&MECHA_INT_CONTROL_LOST?"COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate
":null] - [integrity<30?"DAMAGE LEVEL CRITICAL":null] + [integrity<30?"DAMAGE LEVEL CRITICAL
":null] Integrity: [integrity]%
Powercell charge: [cell.charge/cell.maxcharge*100]%
Air source: [use_internal_tank?"Internal Airtank":"Environment"]
@@ -955,7 +994,7 @@ /datum/global_iterator/mecha_intertial_movement //inertial movement in space delay = 7 - process(var/obj/mecha/mecha,direction) + process(var/obj/mecha/mecha as obj,direction) if(direction) if(!step(mecha, direction)||mecha.check_for_support()) src.stop() @@ -978,8 +1017,7 @@ process(var/obj/mecha/mecha) if(!mecha.internal_damage) - src.stop() - return + return src.stop() if(mecha.internal_damage & MECHA_INT_FIRE) if(mecha.return_pressure()>mecha.maximum_pressure*1.5 && !(mecha.internal_damage&MECHA_INT_TANK_BREACH)) mecha.internal_damage |= MECHA_INT_TANK_BREACH diff --git a/code/game/mecha/mecha_construction.dm b/code/game/mecha/mecha_construction.dm index 22b13f1629..6a4b9f00fd 100644 --- a/code/game/mecha/mecha_construction.dm +++ b/code/game/mecha/mecha_construction.dm @@ -59,6 +59,8 @@ icon_state = "blank" w_class = 20 flags = FPRINT | TABLEPASS | CONDUCT + var/construction_time = 100 + var/list/construction_cost = list("/obj/item/stack/sheet/metal"=20000) /////////// Ripley @@ -383,15 +385,19 @@ list("key"="/obj/item/weapon/wrench"),//9 list("key"="/obj/item/weapon/gun/energy/laser_gun"),//10 list("key"="/obj/item/weapon/screwdriver"),//11 - list("key"="/obj/item/mecha_parts/circuitboard/gygax/targeting"),//12 + list("key"="/obj/item/weapon/stock_parts/adv_capacitor"),//12 list("key"="/obj/item/weapon/screwdriver"),//13 - list("key"="/obj/item/mecha_parts/circuitboard/gygax/peripherals"),//14 + list("key"="/obj/item/weapon/stock_parts/adv_scanning_module"),//14 list("key"="/obj/item/weapon/screwdriver"),//15 - list("key"="/obj/item/mecha_parts/circuitboard/gygax/main"),//16 - list("key"="/obj/item/weapon/wirecutters"),//17 - list("key"="/obj/item/weapon/cable_coil"),//18 + list("key"="/obj/item/mecha_parts/circuitboard/gygax/targeting"),//16 + list("key"="/obj/item/weapon/screwdriver"),//17 + list("key"="/obj/item/mecha_parts/circuitboard/gygax/peripherals"),//18 list("key"="/obj/item/weapon/screwdriver"),//19 - list("key"="/obj/item/weapon/wrench")//20 + list("key"="/obj/item/mecha_parts/circuitboard/gygax/main"),//20 + list("key"="/obj/item/weapon/wirecutters"),//21 + list("key"="/obj/item/weapon/cable_coil"),//22 + list("key"="/obj/item/weapon/screwdriver"),//23 + list("key"="/obj/item/weapon/wrench")//24 ) action(atom/used_atom,mob/user as mob) @@ -403,29 +409,39 @@ //TODO: better messages. switch(step) - if(20) + if(24) user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") - if(19) + if(23) user.visible_message("[user] adjusts [holder] hydraulic systems.", "You adjust [holder] hydraulic systems.") - if(18) + if(22) user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") - if(17) + if(21) user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") - if(16) + if(20) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") del used_atom - if(15) + if(19) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - if(14) + if(18) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") del used_atom - if(13) + if(17) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - if(12) + if(16) user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") del used_atom - if(11) + if(15) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + if(14) + user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") + del used_atom + if(13) + user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") + if(12) + user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") + del used_atom + if(11) + user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") if(10) user.visible_message("[user] installs the laser gun into the weapon socket.", "You install the laser gun into the weapon socket.") del used_atom diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm new file mode 100644 index 0000000000..91481150f7 --- /dev/null +++ b/code/game/mecha/mecha_control_console.dm @@ -0,0 +1,152 @@ +/obj/machinery/computer/mecha + name = "Exosuit Control" + icon = 'computer.dmi' + icon_state = "mecha" + req_access = list(access_robotics) + var/list/located = list() + var/screen = 0 + var/stored_data + + attackby(I as obj, user as mob) + if(istype(I, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/computerframe/A = new /obj/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/mecha_control/M = new /obj/item/weapon/circuitboard/mecha_control( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + del(src) + else + user << "\blue You disconnect the monitor." + var/obj/computerframe/A = new /obj/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/mecha_control/M = new /obj/item/weapon/circuitboard/mecha_control( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + del(src) + return + + attack_ai(var/mob/user as mob) + return src.attack_hand(user) + + attack_paw(var/mob/user as mob) + return src.attack_hand(user) + + attack_hand(var/mob/user as mob) + if(..()) + return + user.machine = src + var/dat = "[src.name]" + if(screen == 0) + dat += "

Tracking beacons data

" + for(var/obj/item/mecha_tracking/TR in world) + var/answer = TR.get_mecha_info() + if(answer) + dat += {"
[answer]
+ Show exosuit log | (EMP pulse)
"} + if(screen==1) + dat += "

Log contents

" + dat += "Return
" + dat += "[stored_data]" + + dat += "(Refresh)
" + dat += "" + + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + return + + Topic(href, href_list) + if(..()) + return + if(href_list["shock"]) + var/obj/item/mecha_tracking/MT = locate(href_list["shock"]) + MT.shock() + if(href_list["get_log"]) + var/obj/item/mecha_tracking/MT = locate(href_list["get_log"]) + stored_data = MT.get_mecha_log() + screen = 1 + if(href_list["return"]) + screen = 0 + src.updateUsrDialog() + return + + + +/obj/item/mecha_tracking + name = "Exosuit tracking beacon" + desc = "Device used to transmit exosuit data." + icon = 'device.dmi' + icon_state = "motion2" + + proc/get_mecha_info() + if(!istype(src.loc, /obj/mecha)) + return 0 + var/obj/mecha/M = src.loc + var/answer = {"Name: [M.name]
+ Integrity: [M.health/initial(M.health)*100]%
+ Cell charge: [M.cell?"[M.cell.charge/M.cell.maxcharge*100]%":"Not found"]
+ Airtank: [M.return_pressure()]kPa
+ Pilot: [M.occupant||"None"]
+ Location: [get_area(M)||"Unknown"]
+ Active equipment:"} + if(istype(M, /obj/mecha/combat)) + var/obj/mecha/combat/CM = M + answer += " [CM.selected_weapon.name]
" + else if(istype(M, /obj/mecha/working)) + var/obj/mecha/working/WM = M + answer += " [WM.selected_tool.name]
" + if(istype(M, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/RM = M + answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" + + return answer + + emp_act() + del src + return + + ex_act() + del src + return + + proc/in_mecha() + if(istype(src.loc, /obj/mecha)) + return 1 + return 0 + + proc/shock() + if(src.in_mecha()) + var/obj/mecha/M = src.loc + M.emp_act(3) + del(src) + + proc/get_mecha_log() + if(!src.in_mecha()) + return 0 + var/obj/mecha/M = src.loc + return M.get_log_html() + + +/obj/item/weapon/storage/mechatrackingbox + + New() + new /obj/item/mecha_tracking(src) + new /obj/item/mecha_tracking(src) + new /obj/item/mecha_tracking(src) + new /obj/item/mecha_tracking(src) + new /obj/item/mecha_tracking(src) + new /obj/item/mecha_tracking(src) + new /obj/item/mecha_tracking(src) + ..() + return diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 3f78854216..d081b89385 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -31,7 +31,7 @@ var/obj/O = locate(href_list["drop_from_cargo"]) if(O && O in src.cargo) src.occupant << "\blue You unload [O]." - O.loc = src.loc + O.loc = get_turf(src) src.cargo -= O var/turf/T = get_turf(O) if(T) @@ -53,13 +53,20 @@ return output /obj/mecha/working/ripley/Del() - for(var/obj/O in cargo) - if(rand(0,1)) - cargo -= O - del O - else - O.loc = get_turf(src) - step_rand(O) + for(var/mob/M in src) + if(M==src.occupant) + continue + M.loc = get_turf(src) + var/turf/T = get_turf(M) + if(T) + T.Entered(M) + step_rand(M) + for(var/atom/movable/A in src.cargo) + A.loc = get_turf(src) + var/turf/T = get_turf(A) + if(T) + T.Entered(A) + step_rand(A) ..() return diff --git a/code/game/mecha/working/tools/tools.dm b/code/game/mecha/working/tools/tools.dm index d22003567f..55cc38c2b8 100644 --- a/code/game/mecha/working/tools/tools.dm +++ b/code/game/mecha/working/tools/tools.dm @@ -60,7 +60,7 @@ name = "Hydraulic Clamp" tool_cooldown = 15 energy_drain = 10 - var/force = 15 + var/force = 20 var/obj/mecha/working/ripley/cargo_holder New() diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index b810fb70e9..c0995edfe6 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -9,6 +9,11 @@ var/add_req_access = 1 internal_damage_threshold = 70 +/obj/mecha/working/New() + ..() + new /obj/item/mecha_tracking(src) + return + /obj/mecha/working/melee_action(atom/target as obj|mob|turf) if(internal_damage&MECHA_INT_CONTROL_LOST) diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm index 5b38a1534a..a03cb59cf5 100644 --- a/code/game/research/designs.dm +++ b/code/game/research/designs.dm @@ -227,6 +227,15 @@ datum materials = list("$glass" = 2000, "acid" = 20) build_path = "/obj/item/weapon/circuitboard/prisoner" + mechacontrol + name = "Circuit Design (Exosuit Control Console)" + desc = "Allows for the construction of circuit boards used to build an exosuit control console." + id = "mechacontrol" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/weapon/circuitboard/mecha_control" + /////////////////////////////////// //////////AI Module Disks////////// /////////////////////////////////// @@ -779,4 +788,4 @@ datum var/datum/design/blueprint New() src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) \ No newline at end of file + src.pixel_y = rand(-5.0, 5) diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index b9b98179f0..752f0fa6c4 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi index b33cbd222b..caf7e20f85 100644 Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 91baa8b45d..0bb9eb4033 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -425,6 +425,7 @@ #include "code\game\mecha\mech_fabricator.dm" #include "code\game\mecha\mecha.dm" #include "code\game\mecha\mecha_construction.dm" +#include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_wreckage.dm" #include "code\game\mecha\combat\combat.dm" #include "code\game\mecha\combat\durand.dm"