diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 17d3dccc287..7909d6cd475 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -121,6 +121,8 @@ proc var/PriorityQueue/open = new /PriorityQueue(/proc/PathWeightCompare) var/closed[] = new() var/path[] + start = get_turf(start) + if(!start) return 0 open.Enqueue(new /PathNode(start,null,0,call(start,dist)(end))) diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm index 05987df680e..d0c4cf223c3 100644 --- a/code/defines/procs/gamehelpers.dm +++ b/code/defines/procs/gamehelpers.dm @@ -81,3 +81,29 @@ //turfs += centerturf return turfs + +/proc/circlerangeturfs(center=usr,radius=3) + + var/turf/centerturf = get_turf(center) + var/list/turfs = new/list() + var/rsq = radius * (radius+0.5) + + for(var/turf/T in range(radius, centerturf)) + var/dx = T.x - centerturf.x + var/dy = T.y - centerturf.y + if(dx*dx + dy*dy <= rsq) + turfs += T + return turfs + +/proc/circleviewturfs(center=usr,radius=3) + + var/turf/centerturf = get_turf(center) + var/list/turfs = new/list() + var/rsq = radius * (radius+0.5) + + for(var/turf/T in view(radius, centerturf)) + var/dx = T.x - centerturf.x + var/dy = T.y - centerturf.y + if(dx*dx + dy*dy <= rsq) + turfs += T + return turfs \ No newline at end of file diff --git a/code/game/asteroid/asteroid.dm b/code/game/asteroid/asteroid.dm index 6d288d76643..e120ab6e8a5 100644 --- a/code/game/asteroid/asteroid.dm +++ b/code/game/asteroid/asteroid.dm @@ -8,8 +8,9 @@ proc/spawn_asteroid(var/atom/start_loc,var/type,var/size,var/richness)//type: 0 if(!richness) richness = rand(10,40) // world << "Asteroid size: [size]; Asteroid type: [type]" - var/list/turfs = circlerange(start_loc,size) + var/list/turfs = circlerangeturfs(start_loc,size) var/area/asteroid/AstAr = new + AstAr.name = "Asteroid #[start_loc.x][start_loc.y][start_loc.z]" for(var/turf/T in turfs) var/dist = get_dist(start_loc,T) if(abs(GaussRand(dist))= 10) + var/x_len = rand(4,size) + var/y_len = pick(4,size) var/st_l = locate(start_loc.x-round(x_len/2),start_loc.y-round(y_len/2),start_loc.z) spawn_room(st_l,x_len,y_len) max_secret_rooms-- -*/ + return 1 -/proc/populate_w_asteroids(var/z,var/density) +/proc/populate_w_asteroids(var/z,var/density=null) if(!density) density = pick(10,20,40) while(density) @@ -96,9 +97,9 @@ proc/spawn_asteroid(var/atom/start_loc,var/type,var/size,var/richness)//type: 0 proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor) var/list/room_turfs = list("walls"=list(),"floors"=list()) - world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]" + //world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]" if(!wall) - wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall) + wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/alien/resin) if(!floor) floor = pick(/turf/simulated/floor,/turf/simulated/floor/engine) @@ -141,7 +142,18 @@ proc/admin_spawn_room_at_pos() spawn_room(locate(x,y,z),x_len,y_len,wall,floor) return +var/global/list/space_surprises = list(/obj/alien/facehugger, + /obj/livestock/spesscarp, + /obj/livestock/spesscarp/elite, + /obj/creature, + /obj/item/weapon/rcd, + /obj/item/weapon/rcd_ammo, + /obj/item/weapon/spacecash, + /obj/item/weapon/cloaking_device, + /obj/item/weapon/gun/energy/teleport_gun, + /obj/item/weapon/rubber_chicken, + /obj/item/weapon/sword/pirate + ) - -var/global/max_secret_rooms = 3 \ No newline at end of file +var/global/max_secret_rooms = 6 diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 38f4310906f..2dd666a0229 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -65,6 +65,8 @@ rcd light flash thingy on matter drain rcdmod.uses -- for(var/obj/item/weapon/rcd/rcd in world) rcd.disabled = 1 + for(var/obj/item/mecha_parts/mecha_equipment/tool/rcd/rcd in world) + rcd.disabled = 1 usr << "RCD-disabling pulse emitted." else usr << "Out of uses." diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 8a6fc0438c9..a2cb685ba09 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -1,9 +1,6 @@ /obj/mecha/combat deflect_chance = 10 health = 500 - - var/list/weapons = new - var/datum/mecha_weapon/selected_weapon operation_req_access = list(access_security) internals_req_access = list(access_engine,access_robotics) var/force = 25 @@ -33,12 +30,14 @@ return */ +/* /obj/mecha/combat/range_action(target as obj|mob|turf) if(internal_damage&MECHA_INT_CONTROL_LOST) target = pick(view(3,target)) if(selected_weapon) selected_weapon.fire(target) return +*/ /obj/mecha/combat/melee_action(target as obj|mob|turf) if(internal_damage&MECHA_INT_CONTROL_LOST) @@ -115,7 +114,7 @@ V.show_message("[src.name] hits [target].", 1) if(!istype(target, /turf/simulated/wall)) target:attackby(src,src.occupant) - else if(prob(5)) + else if(prob(20)) target:dismantle_wall(1) src.occupant_message("\blue You smash through the wall.") src.visible_message("[src.name] smashes through the wall") @@ -153,17 +152,9 @@ return 0 */ -/obj/mecha/combat/Topic(href, href_list) - ..() - if (href_list["select_weapon"]) - var/weapon = locate(href_list["select_weapon"]) - if(weapon) - src.selected_weapon = weapon - return - /obj/mecha/combat/moved_inside(var/mob/living/carbon/human/H as mob) - if(..(H)) + if(..()) if(usr.client) usr.client.mouse_pointer_icon = file("icons/misc/mecha_mouse.dmi") return 1 @@ -176,26 +167,12 @@ ..() return - -/obj/mecha/combat/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null) - ..() - if(prob(5) && (ignore_threshold || (src.health*100/initial(src.health))The [destr_weapon] is destroyed!") - src.log_append_to_last("[destr_weapon] is destoyed.",1) - src.occupant << sound('weapdestr.ogg',volume=50) - return - /obj/mecha/combat/get_stats_part() var/output = ..() output += "Weapon systems:
" - if(weapons.len) - for(var/datum/mecha_weapon/W in weapons) - output += "[selected_weapon==W?"":""][W.get_weapon_info()][selected_weapon==W?"":""]
" + if(equipment.len) + for(var/obj/item/mecha_parts/mecha_equipment/W in equipment) + output += "[selected==W?"":""][W.get_equip_info()][selected==W?"":""]
" else output += "None" output += "
" diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 8ab1c8ac45c..9df6bc6d9e1 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -4,7 +4,7 @@ icon_state = "durand" step_in = 6 health = 350 - deflect_chance = 12 + deflect_chance = 15 max_temperature = 3000 infra_luminosity = 8 operation_req_access = list(access_security) @@ -13,17 +13,20 @@ var/defence_deflect = 30 wreckage = "/obj/decal/mecha_wreckage/durand" - +/* /obj/mecha/combat/durand/New() ..() weapons += new /datum/mecha_weapon/ballistic/lmg(src) weapons += new /datum/mecha_weapon/ballistic/scattershot(src) selected_weapon = weapons[1] return +*/ /obj/mecha/combat/durand/relaymove(mob/user,direction) if(defence) - src.occupant_message("Unable to move while in defence mode") + if(world.time - last_message > 20) + src.occupant_message("Unable to move while in defence mode") + last_message = world.time return 0 . = ..() return diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index c4812e5ae32..6c20420f385 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -11,6 +11,7 @@ operation_req_access = list(access_security) wreckage = "/obj/decal/mecha_wreckage/gygax" +/* /obj/mecha/combat/gygax/New() ..() weapons += new /datum/mecha_weapon/taser(src) @@ -18,6 +19,7 @@ weapons += new /datum/mecha_weapon/missile_rack/flashbang(src) selected_weapon = weapons[1] return +*/ /obj/mecha/combat/gygax/verb/overload() set category = "Exosuit Interface" diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index ac2c279f78b..6c5993f07b2 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -12,20 +12,20 @@ /obj/mecha/combat/honker/New() ..() +/* weapons += new /datum/mecha_weapon/honker(src) weapons += new /datum/mecha_weapon/missile_rack/banana_mortar(src) weapons += new /datum/mecha_weapon/missile_rack/mousetrap_mortar(src) selected_weapon = weapons[1] return +*/ /obj/mecha/combat/honker/melee_action(target) - if(internal_damage&MECHA_INT_CONTROL_LOST) - target = pick(oview(1,src)) if(!melee_can_hit || !istype(target, /atom)) return - if(istype(selected_weapon, /datum/mecha_weapon/honker)) - selected_weapon.fire(target) + if(istype(selected, /obj/item/mecha_parts/mecha_equipment/weapon/honker)) + selected.action(target) else if(istype(target, /mob)) step_away(target,src,15) return @@ -43,9 +43,9 @@ Lights: [lights?"on":"off"]
"} output += "HONKon systems:
" - if(weapons.len) - for(var/datum/mecha_weapon/W in weapons) - output += "[selected_weapon==W?"":""][W.get_weapon_info()][selected_weapon==W?"":""]
" + if(equipment.len) + for(var/obj/item/mecha_parts/mecha_equipment/W in equipment) + output += "[selected==W?"":""][W.get_equip_info()][selected==W?"":""]
" else output += "None. HONK!" output += "
" diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 43543e3eff1..142dfe715c4 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -19,9 +19,10 @@ /obj/mecha/combat/marauder/New() ..() - weapons += new /datum/mecha_weapon/pulse(src) - weapons += new /datum/mecha_weapon/missile_rack(src) - selected_weapon = weapons[1] + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/pulse + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack + ME.attach(src) src.smoke_system.set_up(3, 0, src) src.smoke_system.attach(src) return @@ -30,10 +31,14 @@ if(!can_move) return 0 if(zoom) - src.occupant_message("Unable to move while in zoom mode.") + if(world.time - last_message > 20) + src.occupant_message("Unable to move while in zoom mode.") + last_message = world.time return 0 if(connected_port) - src.occupant_message("Unable to move while connected to the air system port") + if(world.time - last_message > 20) + src.occupant_message("Unable to move while connected to the air system port") + last_message = world.time return 0 if(!thrusters && src.pr_inertial_movement.active()) return 0 diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm new file mode 100644 index 00000000000..b9d251c35eb --- /dev/null +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -0,0 +1,74 @@ +//TODO: Add critfail checks and reliability + +/obj/item/mecha_parts/mecha_equipment + name = "mecha equipment" + icon = 'mech_construct.dmi' + icon_state = "mecha_equip" + force = 5 + construction_time = 100 + construction_cost = list("metal"=10000) + var/equip_cooldown = 0 + var/equip_ready = 1 + var/energy_drain = 0 + var/obj/mecha/chassis = null + var/ranged = 0 + + +/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown() + sleep(equip_cooldown) + if(src && chassis) + return 1 + return 0 + + +/obj/item/mecha_parts/mecha_equipment/New() + ..() + return + + +/obj/item/mecha_parts/mecha_equipment/proc/destroy()//missiles detonating, teleporter creating singularity? + spawn + del src + return + +/obj/item/mecha_parts/mecha_equipment/proc/get_equip_info() + return "* [src.name]" + +/obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not? + return ranged + + +/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target) + if(!target) + return 0 + if(!chassis) + return 0 + if(energy_drain && chassis.get_charge() < energy_drain) + return 0 + if(!equip_ready) + return 0 + return 1 + +/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target) + return + +/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/mecha/M as obj) + if(istype(M)) + if(M.equipment.len[target] succesfully loaded.") + chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") + else + chassis.occupant_message("You must hold still while handling objects.") + O.anchored = initial(O.anchored) + equip_ready = 1 + + else + chassis.occupant_message("Not enough room in cargo compartment.") + else + chassis.occupant_message("[target] is firmly secured.") + + else if(istype(target,/mob)) + var/mob/M = target + if(M.stat>1) return + if(chassis.occupant.a_intent == "hurt") + M.bruteloss += dam_force + M.oxyloss += round(dam_force/2) + M.updatehealth() + chassis.occupant_message("\red You squeese [target] with [src.name]. Something cracks.") + chassis.visible_message("\red [chassis] squeeses [target].") + else + step_away(M,chassis) + chassis.occupant_message("You push [target] out of the way.") + chassis.visible_message("[chassis] pushes [target] out of the way.") + equip_ready = 0 + chassis.cell.use(energy_drain) + spawn(equip_cooldown) + equip_ready = 1 + return 1 + +/obj/item/mecha_parts/mecha_equipment/tool/drill + name = "Drill" + icon_state = "mecha_drill" + equip_cooldown = 40 + energy_drain = 20 + force = 15 + + action(atom/target) + if(!action_checks(target)) return + equip_ready = 0 + chassis.cell.use(energy_drain) + chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") + chassis.occupant_message("You start to drill [target]") + var/T = chassis.loc + if(do_after_cooldown()) + if(T == chassis.loc && src == chassis.selected) + if(istype(target, /turf/simulated/wall/r_wall)) + chassis.occupant_message("[target] is too durable to drill through.") + else if(istype(target, /turf/simulated/mineral)) + var/turf/simulated/mineral/M = target + chassis.log_message("Drilled through [target]") + M.gets_drilled() + for(var/turf/simulated/mineral/N in range(chassis,1)) + if(get_dir(chassis,N)&chassis.dir) + N.gets_drilled() + else + chassis.log_message("Drilled through [target]") + target.ex_act(2) + equip_ready = 1 + return 1 + + +/obj/item/mecha_parts/mecha_equipment/tool/extinguisher + name = "Extinguisher" + icon_state = "mecha_exting" + equip_cooldown = 5 + energy_drain = 0 + + New() + reagents = new/datum/reagents(200) + reagents.my_atom = src + reagents.add_reagent("water", 200) + ..() + return + + action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch. + if(!action_checks(target)) return + if(get_dist(chassis, target)>2) return + equip_ready = 0 + if(do_after_cooldown()) + equip_ready = 1 + if(istype(target, /obj/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) + var/obj/o = target + o.reagents.trans_to(src, 200) + chassis.occupant_message("\blue Extinguisher refilled") + playsound(chassis, 'refill.ogg', 50, 1, -6) + else + if(src.reagents.total_volume > 0) + playsound(chassis, 'extinguish.ogg', 75, 1, -3) + var/direction = get_dir(chassis,target) + var/turf/T = get_turf(target) + var/turf/T1 = get_step(T,turn(direction, 90)) + var/turf/T2 = get_step(T,turn(direction, -90)) + + var/list/the_targets = list(T,T1,T2) + for(var/a=0, a<5, a++) + spawn(0) + var/obj/effects/water/W = new /obj/effects/water(get_turf(chassis)) + if(!W) + return + var/turf/my_target = pick(the_targets) + var/datum/reagents/R = new/datum/reagents(5) + W.reagents = R + R.my_atom = W + src.reagents.trans_to(W,1) + for(var/b=0, b<5, b++) + if(!W) + return + step_towards(W,my_target) + if(!W) + return + var/turf/W_turf = get_turf(W) + W.reagents.reaction(W_turf) + for(var/atom/atm in W_turf) + W.reagents.reaction(atm) + if(W.loc == my_target) + break + sleep(2) + return 1 + + get_equip_info() + return "[..()] \[[src.reagents.total_volume]\]" + + on_reagent_change() + return + + +/obj/item/mecha_parts/mecha_equipment/tool/rcd + name = "Mounted RCD" + icon_state = "mecha_rcd" + equip_cooldown = 20 + energy_drain = 250 + ranged = 1 + construction_time = 1200 + construction_cost = list("metal"=50000,"plasma"=40000,"silver"=30000,"gold"=20000) + var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. + var/disabled = 0 //malf + + action(atom/target) + if(!action_checks(target) || disabled || get_dist(chassis, target)>3) return + playsound(src.loc, 'click.ogg', 50, 1) + //meh + switch(mode) + if(0) + if (istype(target, /turf/simulated/wall)) + chassis.occupant_message("Deconstructing [target]...") + equip_ready = 0 + if(do_after_cooldown()) + if(disabled) return + chassis.spark_system.start() + target:ReplaceWithFloor() + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + equip_ready = 1 + chassis.cell.give(energy_drain) + else if (istype(target, /turf/simulated/floor)) + chassis.occupant_message("Deconstructing [target]...") + equip_ready = 0 + if(do_after_cooldown()) + if(disabled) return + chassis.spark_system.start() + target:ReplaceWithSpace() + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + equip_ready = 1 + chassis.cell.give(energy_drain) + else if (istype(target, /obj/machinery/door/airlock)) + chassis.occupant_message("Deconstructing [target]...") + equip_ready = 0 + if(do_after_cooldown()) + if(disabled) return + chassis.spark_system.start() + del(target) + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + equip_ready = 1 + chassis.cell.give(energy_drain) + if(1) + if(istype(target, /turf/space)) + chassis.occupant_message("Building Floor...") + equip_ready = 0 + if(do_after_cooldown()) + if(disabled) return + target:ReplaceWithFloor() + playsound(chassis.loc, 'Deconstruct.ogg', 50, 1) + chassis.spark_system.start() + equip_ready = 1 + chassis.cell.use(energy_drain*3) + else if(istype(target, /turf/simulated/floor)) + chassis.occupant_message("Building Wall...") + equip_ready = 0 + if(do_after_cooldown()) + if(disabled) return + target:ReplaceWithWall() + playsound(chassis.loc, 'Deconstruct.ogg', 50, 1) + chassis.spark_system.start() + equip_ready = 1 + chassis.cell.use(energy_drain*3) + if(2) + if(istype(target, /turf/simulated/floor)) + chassis.occupant_message("Building Airlock...") + equip_ready = 0 + if(do_after_cooldown()) + if(disabled) return + chassis.spark_system.start() + var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) + T.autoclose = 1 + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + playsound(src.loc, 'sparks2.ogg', 50, 1) + equip_ready = 1 + chassis.cell.use(energy_drain*3) + return + + + Topic(href,href_list) + ..() + if(href_list["mode"]) + mode = text2num(href_list["mode"]) + switch(mode) + if(0) + chassis.occupant_message("Swithed RCD to Deconstruct.") + if(1) + chassis.occupant_message("Swithed RCD to Construct.") + if(2) + chassis.occupant_message("Swithed RCD to Construct Airlock.") + return + + get_equip_info() + return "[..()] \[D|C|A\]" + + + + +/obj/item/mecha_parts/mecha_equipment/teleporter + name = "Teleporter" + icon_state = "mecha_teleport" + equip_cooldown = 300 + energy_drain = 1000 + ranged = 1 + + action(atom/target) + if(!action_checks(target)) return + var/turf/T = get_turf(target) + if(T) + equip_ready = 0 + do_teleport(chassis, T, 4) + if(do_after_cooldown()) + equip_ready = 1 + return + + +/obj/item/mecha_parts/mecha_equipment/wormhole_generator + name = "Wormhole Generator" + icon_state = "mecha_teleport" + equip_cooldown = 50 + energy_drain = 300 + ranged = 1 + + + action(atom/target) + if(!action_checks(target)) return + var/list/theareas = list() + for(var/area/AR in orange(100, chassis)) + if(AR in theareas) continue + theareas += AR + if(!theareas.len) + return + var/area/thearea = pick(theareas) + var/list/L = list() + for(var/turf/T in get_area_turfs(thearea.type)) + if(!T.density) + var/clear = 1 + for(var/obj/O in T) + if(O.density) + clear = 0 + break + if(clear) + L+=T + if(!L.len) + return + var/turf/target_turf = pick(L) + if(!target_turf) + return + chassis.cell.use(energy_drain) + equip_ready = 0 + var/obj/portal/P = new /obj/portal(get_turf(target)) + P.target = target_turf + P.creator = null + P.icon = 'objects.dmi' + P.failchance = 0 + P.icon_state = "anom" + P.name = "wormhole" + if(do_after_cooldown()) + equip_ready = 1 + src = null + spawn(rand(150,300)) + del(P) + return \ No newline at end of file diff --git a/code/game/mecha/combat/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm similarity index 62% rename from code/game/mecha/combat/weapons/weapons.dm rename to code/game/mecha/equipment/weapons/weapons.dm index dd472656ba2..03454e4e51b 100644 --- a/code/game/mecha/combat/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -1,136 +1,30 @@ -/datum/mecha_weapon - var/name = "mecha weapon" - var/weapon_cooldown = 0 - var/weapon_ready = 1 - var/energy_drain = 0 - var/obj/mecha/combat/chassis = null +/obj/item/mecha_parts/mecha_equipment/weapon + name = "mecha weapon" + ranged = 1 + origin_tech = "materials=3;combat=3" -/datum/mecha_weapon/New(mecha) - if(!istype(mecha, /obj/mecha/combat)) - return - src.chassis = mecha - chassis.log_append_to_last("[src.name] initialized.") - return +/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/M as obj) + if(..()) + if(istype(M, /obj/mecha/combat)) + return 1 + return 0 -/datum/mecha_weapon/proc/destroy() - spawn - del src - return - - -/datum/mecha_weapon/proc/get_weapon_info() - return src.name - - -/datum/mecha_weapon/proc/fire_checks(target) //general checks. - if(!target) - return 0 - if(!chassis) - return 0 - if(energy_drain && chassis.get_charge() < energy_drain) - return 0 - if(!weapon_ready) - return 0 - return 1 - -/datum/mecha_weapon/proc/fire(target) - return fire_checks(target) - - - -/datum/mecha_weapon/missile_rack //TODO: move missile racks to ballistic class - name = "SRM-8 Missile Rack" - var/missiles = 8 - var/missile_speed = 2 - var/missile_range = 30 - var/missile_energy_cost = 1000 - weapon_cooldown = 60 - - fire(target) - if(!fire_checks(target) || missiles <=0) return - weapon_ready = 0 - var/obj/item/missile/M = new /obj/item/missile(chassis.loc) - M.primed = 1 - playsound(chassis, 'bang.ogg', 50, 1) - M.throw_at(target, missile_range, missile_speed) - missiles-- - spawn(weapon_cooldown) - weapon_ready = 1 - chassis.log_message("Fired from [src.name], targeting [target].") - return - - proc/rearm() - if(missiles < initial(missiles)) - var/missiles_to_add = initial(missiles) - missiles - while(chassis.get_charge() >= missile_energy_cost && missiles_to_add) - missiles++ - missiles_to_add-- - chassis.cell.use(missile_energy_cost) - chassis.log_message("Rearmed [src.name].") - return - - get_weapon_info() - return "[src.name]\[[src.missiles]\][(src.missiles < initial(src.missiles))?" - Rearm":null]" - - Topic(href, href_list) - if (href_list["rearm"]) - src.rearm() - return - - - -/obj/item/missile - icon = 'grenade.dmi' - icon_state = "flashbang" - var/primed = null - throwforce = 15 - - throw_impact(atom/hit_atom) - if(primed) - explosion(hit_atom, 0, 0, 2, 4) - del(src) - else - ..() - return - -/datum/mecha_weapon/missile_rack/flashbang - name = "SGL-6 Grenade Launcher" - missiles = 6 - missile_speed = 1.5 - missile_energy_cost = 800 - weapon_cooldown = 60 - var/det_time = 20 - - fire(target) - if(!fire_checks(target) || missiles <=0) return - weapon_ready = 0 - var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(chassis.loc) - playsound(chassis, 'bang.ogg', 50, 1) - F.throw_at(target, missile_range, missile_speed) - missiles-- - spawn(det_time) - F.prime() - spawn(weapon_cooldown) - weapon_ready = 1 - chassis.log_message("Fired from [src.name], targeting [target].") - return - -/datum/mecha_weapon/laser - weapon_cooldown = 10 +/obj/item/mecha_parts/mecha_equipment/weapon/laser + equip_cooldown = 10 name = "CH-PS \"Immolator\" Laser" + icon_state = "mecha_laser" energy_drain = 30 - fire(target) - if(!fire_checks(target)) return - + action(target) + if(!action_checks(target)) return var/turf/curloc = chassis.loc var/atom/targloc = get_turf(target) if (!targloc || !istype(targloc, /turf) || !curloc) return if (targloc == curloc) return - weapon_ready = 0 + equip_ready = 0 playsound(chassis, 'Laser.ogg', 50, 1) var/obj/beam/a_laser/A = new /obj/beam/a_laser(curloc) A.current = curloc @@ -138,19 +32,20 @@ A.xo = targloc.x - curloc.x chassis.cell.use(energy_drain) A.process() - spawn(weapon_cooldown) - weapon_ready = 1 chassis.log_message("Fired from [src.name], targeting [target].") + if(do_after_cooldown()) + equip_ready = 1 return -/datum/mecha_weapon/pulse - weapon_cooldown = 30 +/obj/item/mecha_parts/mecha_equipment/weapon/pulse + equip_cooldown = 30 name = "eZ-13 mk2 Heavy pulse rifle" + icon_state = "mecha_pulse" energy_drain = 120 - fire(target) - if(!fire_checks(target)) return + action(target) + if(!action_checks(target)) return var/turf/curloc = chassis.loc var/atom/targloc = get_turf(target) @@ -164,12 +59,12 @@ A.current = curloc A.yo = targloc.y - curloc.y A.xo = targloc.x - curloc.x - weapon_ready = 0 + equip_ready = 0 chassis.cell.use(energy_drain) A.process() - spawn(weapon_cooldown) - weapon_ready = 1 chassis.log_message("Fired from [src.name], targeting [target].") + if(do_after_cooldown()) + equip_ready = 1 return @@ -183,14 +78,14 @@ src.life -= 10 return -/datum/mecha_weapon/taser - weapon_cooldown = 10 +/obj/item/mecha_parts/mecha_equipment/weapon/taser name = "PBT \"Pacifier\" Mounted Taser" + icon_state = "mecha_taser" energy_drain = 20 - weapon_cooldown = 7 + equip_cooldown = 7 - fire(target) - if(!fire_checks(target)) return + action(target) + if(!action_checks(target)) return var/turf/curloc = chassis.loc var/atom/targloc = get_turf(target) @@ -204,70 +99,37 @@ A.current = curloc A.yo = targloc.y - curloc.y A.xo = targloc.x - curloc.x - weapon_ready = 0 + equip_ready = 0 chassis.cell.use(energy_drain) spawn() A.process() - spawn(weapon_cooldown) - weapon_ready = 1 chassis.log_message("Fired from [src.name], targeting [target].") + if(do_after_cooldown()) + equip_ready = 1 return -/datum/mecha_weapon/missile_rack/banana_mortar - name = "Banana Mortar" - missiles = 15 - missile_speed = 1.5 - missile_energy_cost = 100 - weapon_cooldown = 20 - - fire(target) - if(!fire_checks(target) || missiles <=0) return - weapon_ready = 0 - var/obj/item/weapon/bananapeel/B = new /obj/item/weapon/bananapeel(chassis.loc) - playsound(chassis, 'bikehorn.ogg', 60, 1) - B.throw_at(target, missile_range, missile_speed) - missiles-- - spawn(weapon_cooldown) - weapon_ready = 1 - chassis.log_message("Bananed from [src.name], targeting [target]. HONK!") - return - - -/datum/mecha_weapon/missile_rack/mousetrap_mortar - name = "Mousetrap Mortar" - missiles = 15 - missile_speed = 1.5 - missile_energy_cost = 100 - weapon_cooldown = 10 - - fire(target) - if(!fire_checks(target) || missiles <=0) return - weapon_ready = 0 - var/obj/item/weapon/mousetrap/M = new /obj/item/weapon/mousetrap(chassis.loc) - M.armed = 1 - playsound(chassis, 'bikehorn.ogg', 60, 1) - M.throw_at(target, missile_range, missile_speed) - missiles-- - spawn(weapon_cooldown) - weapon_ready = 1 - chassis.log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!") - return - - -/datum/mecha_weapon/honker - weapon_cooldown = 10 +/obj/item/mecha_parts/mecha_equipment/weapon/honker name = "HoNkER BlAsT 5000" + icon_state = "mecha_honker" energy_drain = 200 - weapon_cooldown = 150 + equip_cooldown = 150 + construction_time = 500 + construction_cost = list("metal"=20000,"bananium"=10000) - fire(target) + can_attach(obj/mecha/M as obj) + if(..()) + if(istype(M, /obj/mecha/combat/honker)) + return 1 + return 0 + + action(target) if(!chassis) return 0 if(energy_drain && chassis.get_charge() < energy_drain) return 0 - if(!weapon_ready) + if(!equip_ready) return 0 - weapon_ready = 0 + equip_ready = 0 playsound(chassis, 'AirHorn.ogg', 100, 1) chassis.occupant_message("HONK") for(var/mob/living/carbon/M in ohearers(6, chassis)) @@ -297,20 +159,24 @@ walk(thingy,0) */ chassis.cell.use(energy_drain) - spawn(weapon_cooldown) - weapon_ready = 1 chassis.log_message("Honked from [src.name]. HONK!") + if(do_after_cooldown()) + equip_ready = 1 return - - -/datum/mecha_weapon/ballistic +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "General Ballisic Weapon" var/projectiles var/projectile_energy_cost - get_weapon_info() - return "[src.name]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" + action_checks(atom/target) + if(..()) + if(projectiles > 0) + return 1 + return 0 + + get_equip_info() + return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" proc/rearm() if(projectiles < initial(projectiles)) @@ -328,16 +194,17 @@ return -/datum/mecha_weapon/ballistic/scattershot +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "LBX AC 10 \"Scattershot\"" - weapon_cooldown = 20 + icon_state = "mecha_scatter" + equip_cooldown = 20 projectiles = 100 projectile_energy_cost = 25 var/projectiles_per_shot = 4 var/deviation = 0.7 - fire(atom/target) - if(!fire_checks(target) || projectiles <=0) return + action(atom/target) + if(!action_checks(target)) return var/turf/curloc = get_turf(chassis) var/turf/targloc = get_turf(target) if(!curloc || !targloc) return @@ -355,25 +222,26 @@ A.current = curloc A.yo = targloc.y - curloc.y A.xo = targloc.x - curloc.x - weapon_ready = 0 + equip_ready = 0 A.process() - spawn(weapon_cooldown) - weapon_ready = 1 chassis.log_message("Fired from [src.name], targeting [target].") + if(do_after_cooldown()) + equip_ready = 1 return -/datum/mecha_weapon/ballistic/lmg +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "Ultra AC 2" - weapon_cooldown = 10 + icon_state = "mecha_uac2" + equip_cooldown = 10 projectiles = 300 projectile_energy_cost = 20 var/projectiles_per_shot = 3 var/deviation = 0.3 - fire(atom/target) - if(!fire_checks(target) || projectiles <=0) return + action(atom/target) + if(!action_checks(target)) return var/turf/targloc = get_turf(target) var/target_x = targloc.x var/target_y = targloc.y @@ -395,10 +263,127 @@ A.xo = targloc.x - curloc.x A.process() sleep(2) - weapon_ready = 0 - spawn(weapon_cooldown) - weapon_ready = 1 + equip_ready = 0 chassis.log_message("Fired from [src.name], targeting [target].") + if(do_after_cooldown()) + equip_ready = 1 + return + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack + name = "SRM-8 Missile Rack" + icon_state = "mecha_missilerack" + projectiles = 8 + projectile_energy_cost = 1000 + equip_cooldown = 60 + var/missile_speed = 2 + var/missile_range = 30 + + action(target) + if(!action_checks(target)) return + equip_ready = 0 + var/obj/item/missile/M = new /obj/item/missile(chassis.loc) + M.primed = 1 + playsound(chassis, 'bang.ogg', 50, 1) + M.throw_at(target, missile_range, missile_speed) + projectiles-- + chassis.log_message("Fired from [src.name], targeting [target].") + if(do_after_cooldown()) + equip_ready = 1 return +/obj/item/missile + icon = 'grenade.dmi' + icon_state = "flashbang" + var/primed = null + throwforce = 15 + + throw_impact(atom/hit_atom) + if(primed) + explosion(hit_atom, 0, 0, 2, 4) + del(src) + else + ..() + return + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang + name = "SGL-6 Grenade Launcher" + icon_state = "mecha_grenadelnchr" + projectiles = 6 + missile_speed = 1.5 + projectile_energy_cost = 800 + equip_cooldown = 60 + var/det_time = 20 + + action(target) + if(!action_checks(target)) return + equip_ready = 0 + var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(chassis.loc) + playsound(chassis, 'bang.ogg', 50, 1) + F.throw_at(target, missile_range, missile_speed) + projectiles-- + chassis.log_message("Fired from [src.name], targeting [target].") + spawn(det_time) + F.prime() + if(do_after_cooldown()) + equip_ready = 1 + return + + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar + name = "Banana Mortar" + icon_state = "mecha_bananamrtr" + projectiles = 15 + missile_speed = 1.5 + projectile_energy_cost = 100 + equip_cooldown = 20 + construction_time = 300 + construction_cost = list("metal"=20000,"bananium"=5000) + + can_attach(obj/mecha/M as obj) + if(..()) + if(istype(M, /obj/mecha/combat/honker)) + return 1 + return 0 + + action(target) + if(!action_checks(target)) return + equip_ready = 0 + var/obj/item/weapon/bananapeel/B = new /obj/item/weapon/bananapeel(chassis.loc) + playsound(chassis, 'bikehorn.ogg', 60, 1) + B.throw_at(target, missile_range, missile_speed) + projectiles-- + chassis.log_message("Bananed from [src.name], targeting [target]. HONK!") + if(do_after_cooldown()) + equip_ready = 1 + return + + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar + name = "Mousetrap Mortar" + icon_state = "mecha_mousetrapmrtr" + projectiles = 15 + missile_speed = 1.5 + projectile_energy_cost = 100 + equip_cooldown = 10 + construction_time = 300 + construction_cost = list("metal"=20000,"bananium"=5000) + + can_attach(obj/mecha/M as obj) + if(..()) + if(istype(M, /obj/mecha/combat/honker)) + return 1 + return 0 + + action(target) + if(!action_checks(target)) return + equip_ready = 0 + var/obj/item/weapon/mousetrap/M = new /obj/item/weapon/mousetrap(chassis.loc) + M.armed = 1 + playsound(chassis, 'bikehorn.ogg', 60, 1) + M.throw_at(target, missile_range, missile_speed) + projectiles-- + chassis.log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!") + if(do_after_cooldown()) + equip_ready = 1 + return \ No newline at end of file diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index c0e734adf1f..3e901b88577 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -398,6 +398,7 @@ "silver"=0, "diamond"=0, "plasma"=0, + "uranium"=0, "bananium"=0 ) var/res_max_amount = 200000 @@ -436,6 +437,20 @@ /obj/item/mecha_parts/part/honker_left_leg, /obj/item/mecha_parts/part/honker_right_leg ), + "Exosuit Equipment"=list( + /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, + /obj/item/mecha_parts/mecha_equipment/tool/drill, + /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, + /obj/item/mecha_parts/mecha_equipment/tool/rcd, + /obj/item/mecha_parts/mecha_equipment/weapon/laser, + /obj/item/mecha_parts/mecha_equipment/weapon/taser, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar, + /obj/item/mecha_parts/mecha_equipment/weapon/honker), + "Misc"=list(/obj/item/mecha_tracking) ) @@ -535,7 +550,7 @@ proc/output_available_resources() var/output for(var/resource in resources) - output += "[resource]: [min(res_max_amount, resources[resource])] cm3
" + output += "[resource]: [min(res_max_amount, resources[resource])] cm³
" return output proc/remove_resources(var/obj/item/mecha_parts/part as obj) @@ -733,6 +748,8 @@ material = "glass" else if(istype(W, /obj/item/stack/sheet/clown)) material = "bananium" + else if(istype(W, /obj/item/stack/sheet/uranium)) + material = "uranium" else return ..() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f9565e1b0ca..f6a02c64da5 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -24,6 +24,7 @@ var/obj/item/weapon/cell/cell = new var/state = 0 var/list/log = new + var/last_message = 0 var/datum/effects/system/spark_spread/spark_system = new var/lights = 0 @@ -52,6 +53,10 @@ var/wreckage + var/list/equipment = new + var/obj/item/mecha_parts/mecha_equipment/selected + var/max_equip = 2 + /obj/mecha/New() ..() @@ -111,50 +116,21 @@ var/dir_to_target = get_dir(src,target) if(dir_to_target && !(dir_to_target & src.dir))//wrong direction return - if(get_dist(src,target)>1) - src.range_action(target) + if(internal_damage&MECHA_INT_CONTROL_LOST) + target = pick(view(3,target)) + var/dist = get_dist(src, target) + if(dist>1) + if(selected && selected.is_ranged()) + selected.action(target) + else if(selected && !selected.is_ranged()) + selected.action(target) else src.melee_action(target) return /obj/mecha/proc/melee_action(atom/target) -/* - 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 + return /obj/mecha/proc/range_action(atom/target) return @@ -234,15 +210,23 @@ // src.inertia_dir = null if(istype(obstacle, /obj)) var/obj/O = obstacle - if(istype(obstacle , /obj/machinery/door)) + if(istype(O , /obj/machinery/door)) if(src.occupant) O.Bumped(src.occupant) + /* //not working, will fix later + else if(istype(O, /obj/portal)) //derpfix + src.anchored = 0 + O.Bumped(src) + src.anchored = 1 + */ else if(!O.anchored) step(obstacle,src.dir) -// else -// obstacle.Bumped(src) + else //I have no idea why I disabled this + obstacle.Bumped(src) else if(istype(obstacle, /mob)) step(obstacle,src.dir) + else + obstacle.Bumped(src) return @@ -255,12 +239,13 @@ if("brute") src.health -= amount if("fire") - src.health -= amount*1.2 + amount *= 1.2 + src.health -= amount src.update_health() src.log_append_to_last("Took [amount] points of damage. Damage type: \"[type]\".",1) return -/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)//TODO +/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null) if(!src) return if(prob(25)) if(ignore_threshold || src.health*100/initial(src.health)The [destr] is destroyed!") + src.log_append_to_last("[destr] is destroyed.",1) + if(istype(destr, /obj/item/mecha_parts/mecha_equipment/weapon)) + src.occupant << sound('weapdestr.ogg',volume=50) + else + src.occupant << sound('critdestr.ogg',volume=50) return @@ -390,12 +390,20 @@ // var/mob/M = src.occupant var/turf/T = src.loc var/wreckage = src.wreckage + var/list/r_equipment = src.equipment src = null del(mecha) explosion(T, 0, 0, 1, 3) spawn(0) if(wreckage) - new wreckage(T) + 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.equipment += E + E.reliability = rand(30,100) + else + E.loc = T + E.destroy() return /obj/mecha/ex_act(severity) @@ -596,7 +604,10 @@ return usr << "You start climbing into [src.name]" spawn(20) - moved_inside(usr) + if(!src.occupant) + moved_inside(usr) + else if(src.occupant!=usr) + usr << "[src.occupant] was faster. Try better next time, loser." return /obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob) @@ -730,6 +741,16 @@ /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/mecha_parts/mecha_equipment)) + var/obj/item/mecha_parts/mecha_equipment/E = W + spawn() + if(E.can_attach(src)) + user.drop_item() + E.attach(src) + user.visible_message("[user] attaches [W] to [src]", "You attach [W] to [src]") + else + user << "You were unable to attach [W] to [src]" + return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(src.occupant) user << "Unable to initiate maintenance protocol." @@ -900,6 +921,10 @@ else src.occupant_message("Recalibration failed.") src.log_message("Recalibration of coordination system failed with 1 error.",1) + if(href_list["select_equip"]) + var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) + if(equip) + src.selected = equip /* if (href_list["ai_take_control"]) @@ -965,10 +990,24 @@ /obj/mecha/hear_talk(mob/M as mob, text) if(occupant && M) + if(!occupant.say_understands(M)) + text = stars(text) var/rendered = "[M.name] [M.say_quote(text)]" occupant.show_message(rendered, 2) return +/* +if ("binary") + if(src.robot_talk_understand || src.binarycheck()) + //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant + src.robot_talk(message) + return +if ("alientalk") + if(src.alien_talk_understand || src.hivecheck()) + //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant + src.alien_talk(message) + return +*/ /obj/mecha/proc/get_charge()//returns null if no powercell, else returns cell.charge if(!src.cell) return return max(0, src.cell.charge) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 89dce975e53..70bc263e669 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -102,13 +102,7 @@ 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]
" + Active equipment: [M.selected||"None"]"} 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]%
" diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 0e8ec6875b0..927f5718145 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -13,6 +13,7 @@ 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/salvage_num = 5 /obj/decal/mecha_wreckage/ex_act(severity) @@ -50,6 +51,12 @@ user << "You failed to salvage anything valuable from [src]." salvage_num-- if(istype(W, /obj/item/weapon/crowbar)) + if(equipment.len) + var/obj/item/mecha_parts/mecha_equipment/E = pick(equipment) + if(E) + E.loc = get_turf(user) + user.visible_message("[user] pries [E] from [src].", "You pry [E] from [src].") + return if(salvage_num<=0) user << "You can't see anything of value left on this wreck." return diff --git a/code/game/mecha/working/firefighter.dm b/code/game/mecha/working/firefighter.dm index 8358ea5c9be..323aedea476 100644 --- a/code/game/mecha/working/firefighter.dm +++ b/code/game/mecha/working/firefighter.dm @@ -1,15 +1,15 @@ /obj/mecha/working/firefighter - desc = "Standart APLU chassis was refitted with additional thermal protection, cistern and fire pump." + desc = "Standart APLU chassis was refitted with additional thermal protection and cistern." name = "Ripley-on-Fire" icon_state = "ripley" step_in = 8 max_temperature = 6000 - health = 200 + health = 250 internal_damage_threshold = 40 wreckage = "/obj/decal/mecha_wreckage/ripley" infra_luminosity = 5 - +/* /obj/mecha/working/firefighter/New() ..() // tools += new /datum/mecha_tool/uni_interface(src) @@ -21,4 +21,5 @@ tools += new g_type(src) */ selected_tool = tools[1] - return \ No newline at end of file + return +*/ \ No newline at end of file diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index d081b89385b..27cd2c149a2 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -6,23 +6,19 @@ max_temperature = 1000 health = 200 wreckage = "/obj/decal/mecha_wreckage/ripley" - var/list/cargo = new var/cargo_capacity = 15 - +/* /obj/mecha/working/ripley/New() ..() -// tools += new /datum/mecha_tool/uni_interface(src) - tools += new /datum/mecha_tool/hydraulic_clamp(src) - tools += new /datum/mecha_tool/drill(src) -/* - for(var/g_type in typesof(/datum/mecha_tool/gimmick)) - if(g_type!=/datum/mecha_tool/gimmick) - tools += new g_type(src) -*/ - selected_tool = tools[1] return +*/ + +/obj/mecha/working/ripley/Exit(atom/movable/O) + if(O in cargo) + return 0 + return ..() /obj/mecha/working/ripley/Topic(href, href_list) @@ -57,9 +53,7 @@ if(M==src.occupant) continue M.loc = get_turf(src) - var/turf/T = get_turf(M) - if(T) - T.Entered(M) + M.loc.Entered(M) step_rand(M) for(var/atom/movable/A in src.cargo) A.loc = get_turf(src) diff --git a/code/game/mecha/working/tools/tools.dm b/code/game/mecha/working/tools/tools.dm deleted file mode 100644 index 9b24a09d938..00000000000 --- a/code/game/mecha/working/tools/tools.dm +++ /dev/null @@ -1,297 +0,0 @@ -/datum/mecha_tool - var/name = "mecha tool" - var/tool_cooldown = 0 - var/tool_ready = 1 - var/energy_drain = 0 - var/obj/mecha/working/chassis = null - - -/datum/mecha_tool/New(mecha) - if(!istype(mecha, /obj/mecha/working)) - return - src.chassis = mecha - chassis.log_append_to_last("[src.name] initialized.") - return - - -/datum/mecha_tool/proc/destroy() - spawn - del src - return - -/datum/mecha_tool/proc/get_tool_info() - return src.name - - -/datum/mecha_tool/proc/action(atom/target) - if(!target) - return 0 - if(!chassis) - return 0 - if(energy_drain && chassis.get_charge() < energy_drain) - return 0 - if(!tool_ready) - return 0 - return 1 - -/datum/mecha_tool/proc/range_action(atom/target) - return - - -/* - //Merde, cette proc est tres bugged -/datum/mecha_tool/uni_interface - name = "Universal Interface" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 5 - - action(atom/target) - if(!..()) return - if(istype(target, /obj)) - var/obj/O = target - if(O.allowed(chassis.occupant)) - target.attack_hand(chassis.occupant) - return - -*/ - -/datum/mecha_tool/hydraulic_clamp - name = "Hydraulic Clamp" - tool_cooldown = 15 - energy_drain = 10 - var/force = 20 - var/obj/mecha/working/ripley/cargo_holder - - New() - ..() - if(istype(chassis, /obj/mecha/working/ripley)) - cargo_holder = chassis - return - - action(atom/target) - if(!..()) return - if(!cargo_holder) return - if(istype(target,/obj)) - var/obj/O = target - if(!O.anchored) - if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) - 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.") - tool_ready = 0 - chassis.cell.use(energy_drain) - O.anchored = 1 - var/T = chassis.loc - spawn(tool_cooldown) - if(chassis) - if(T == chassis.loc && src == chassis.selected_tool) - cargo_holder.cargo += O - O.loc = chassis - O.anchored = 0 - if(istype(O, /obj/machinery/bot))// That's shit-code right here, folks. - O:on = 0 - chassis.occupant_message("[target] succesfully loaded.") - chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") - else - chassis.occupant_message("You must hold still while handling objects.") - O.anchored = initial(O.anchored) - tool_ready = 1 - - else - chassis.occupant << "Not enough room in cargo compartment." - else - chassis.occupant << "[target] is firmly secured." - - else if(istype(target,/mob)) - var/mob/M = target - if(M.stat>1) return - if(chassis.occupant.a_intent == "hurt") - M.bruteloss += force - M.oxyloss += round(force/2) - M.updatehealth() - chassis.occupant_message("\red You squeese [target] with [src.name]. Something cracks.") - chassis.visible_message("\red [chassis] squeeses [target].") - else - step_away(M,chassis) - chassis.occupant_message("You push [target] out of the way.") - chassis.visible_message("[chassis] pushes [target] out of the way.") - tool_ready = 0 - chassis.cell.use(energy_drain) - spawn(tool_cooldown) - tool_ready = 1 - return - -/datum/mecha_tool/drill - name = "Drill" - tool_cooldown = 40 - energy_drain = 20 - var/force = 15 - - action(atom/target) - if(!..()) return - tool_ready = 0 - chassis.cell.use(energy_drain) - chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") - chassis.occupant_message("You start to drill [target]") - var/T = chassis.loc - spawn(tool_cooldown) - if(chassis) - if(T == chassis.loc && src == chassis.selected_tool) - if(istype(target, /turf/simulated/wall/r_wall)) - chassis.occupant_message("[target] is too durable to drill through.") - else if(istype(target, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = target - chassis.log_message("Drilled through [target]") - M.gets_drilled() - for(var/turf/simulated/mineral/N in range(chassis,1)) - if(get_dir(chassis,N)&chassis.dir) - N.gets_drilled() - else - chassis.log_message("Drilled through [target]") - target.ex_act(2) - tool_ready = 1 - return - - -/datum/mecha_tool/extinguisher - name = "Extinguisher" - tool_cooldown = 7 - energy_drain = 0 - var/datum/reagents/reagents - - - New() - reagents = new/datum/reagents(200) - reagents.my_atom = src - reagents.add_reagent("water", 200) - ..() - return - - action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch. - if(!..()) return - if(get_dist(chassis, target)>2) return - tool_ready = 0 - spawn(tool_cooldown) - tool_ready = 1 - if(istype(target, /obj/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) - var/obj/o = target - o.reagents.trans_to(src, 200) - chassis.occupant_message("\blue Extinguisher refilled") - playsound(chassis, 'refill.ogg', 50, 1, -6) - else - if(src.reagents.total_volume > 0) - playsound(chassis, 'extinguish.ogg', 75, 1, -3) - var/direction = get_dir(chassis,target) - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) - - var/list/the_targets = list(T,T1,T2) - for(var/a=0, a<5, a++) - spawn(0) - var/obj/effects/water/W = new /obj/effects/water(get_turf(chassis)) - if(!W) - return - var/turf/my_target = pick(the_targets) - var/datum/reagents/R = new/datum/reagents(5) - W.reagents = R - R.my_atom = W - src.reagents.trans_to(W,1) - for(var/b=0, b<5, b++) - if(!W) - return - step_towards(W,my_target) - if(!W) - return - var/turf/W_turf = get_turf(W) - W.reagents.reaction(W_turf) - for(var/atom/atm in W_turf) - W.reagents.reaction(atm) - if(W.loc == my_target) - break - sleep(2) - return - - get_tool_info() - return "[src.name] \[[src.reagents.total_volume]\]" - - proc/on_reagent_change() - return - - -/* -/datum/mecha_tool/gimmick - name = "Gimmick" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 10 - var/real_tool_type - var/real_tool_obj - - action(atom/target) - if(!..()) return - target.attackby(real_tool_obj,chassis.occupant) - tool_ready = 0 - chassis.cell.use(energy_drain) - spawn(tool_cooldown) - tool_ready = 1 - return - - New() - ..() - real_tool_obj = new real_tool_type(chassis) - return - -/datum/mecha_tool/gimmick/screwdriver - name = "Screwdriver" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 10 - real_tool_type = /obj/item/weapon/screwdriver - - -/datum/mecha_tool/gimmick/wrench - name = "Wrench" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 10 - real_tool_type = /obj/item/weapon/wrench - -/datum/mecha_tool/gimmick/wirecutters - name = "Wirecutters" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 10 - real_tool_type = /obj/item/weapon/wirecutters - -/datum/mecha_tool/gimmick/multitool - name = "Multitool" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 10 - real_tool_type = /obj/item/device/multitool - -/datum/mecha_tool/gimmick/crowbar - name = "Crowbar" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 10 - real_tool_type = /obj/item/weapon/crowbar - -/datum/mecha_tool/gimmick/weldingtool - name = "Weldingtool" - tool_cooldown = 10 - tool_ready = 1 - energy_drain = 15 - real_tool_type = /obj/item/weapon/weldingtool - - action(atom/target) - var/obj/item/weapon/weldingtool/W = real_tool_obj - W.welding = 1 - W.reagents.add_reagent("fuel", W.reagents.maximum_volume - W.get_fuel()) - ..() - return -*/ - - - diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index c0995edfe65..c113d650420 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -2,8 +2,6 @@ deflect_chance = 10 health = 500 req_access = access_heads - var/datum/mecha_tool/selected_tool - var/list/tools = new operation_req_access = list(access_engine,access_robotics) internals_req_access = list(access_engine,access_robotics) var/add_req_access = 1 @@ -14,23 +12,20 @@ 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) target = pick(oview(1,src)) if(selected_tool) selected_tool.action(target) return +*/ /obj/mecha/working/range_action(atom/target as obj|mob|turf) return /obj/mecha/working/Topic(href, href_list) ..() - if (href_list["select_tool"]) - var/tool = locate(href_list["select_tool"]) - if(tool) - src.selected_tool = tool if (href_list["unlock_id_upload"]) add_req_access = 1 if (href_list["add_req_access"]) @@ -50,29 +45,15 @@ /obj/mecha/working/get_stats_part() var/output = ..() output += "[src.name] Tools:
" - if(tools.len) - for(var/datum/mecha_tool/MT in tools) - output += "[selected_tool==MT?"":""][MT.get_tool_info()][selected_tool==MT?"":""]
" + if(equipment.len) + for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) + output += "[selected==MT?"":""][MT.get_equip_info()][selected==MT?"":""]
" else output += "None" output += "
" return output -/obj/mecha/working/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null) - ..() - if(prob(5) && (ignore_threshold || (src.health*100/initial(src.health))The [destr_tool] is destroyed!") - src.log_append_to_last("[destr_tool] is destroyed.") - src.occupant << sound('critdestr.ogg',volume=50) - return - - /obj/mecha/working/attackby(obj/item/weapon/W as obj, mob/user as mob) if(add_req_access && (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))) var/obj/item/weapon/card/id/id_card diff --git a/icons/misc/mech_construct.dmi b/icons/misc/mech_construct.dmi index b0d3f5d8f58..1eddcc3d142 100644 Binary files a/icons/misc/mech_construct.dmi and b/icons/misc/mech_construct.dmi differ diff --git a/maps/tgstation.2.0.3.dmm b/maps/tgstation.2.0.3.dmm index e76c645bb48..9547f647081 100644 --- a/maps/tgstation.2.0.3.dmm +++ b/maps/tgstation.2.0.3.dmm @@ -913,7 +913,7 @@ "arC" = (/obj/machinery/door/airlock/external{name = "West Auxillary Solar Maintenance"; req_access = null; req_access_txt = "13"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "arD" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/storage/tech) "arE" = (/obj/rack{dir = 8},/obj/item/weapon/circuitboard/aiupload,/turf/simulated/floor,/area/storage/tech) -"arF" = (/obj/rack{dir = 8},/obj/item/weapon/circuitboard/robotics,/turf/simulated/floor,/area/storage/tech) +"arF" = (/obj/rack{dir = 8},/obj/item/weapon/circuitboard/mecha_control{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/robotics{pixel_x = 1; pixel_y = -1},/turf/simulated/floor,/area/storage/tech) "arG" = (/obj/machinery/atmospherics/pipe/simple{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "arH" = (/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "arI" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) diff --git a/tgstation.dme b/tgstation.dme index aa6f4cb3662..32b803f3950 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -53,9 +53,10 @@ #define FILE_DIR "code/game/magic/cultist" #define FILE_DIR "code/game/mecha" #define FILE_DIR "code/game/mecha/combat" -#define FILE_DIR "code/game/mecha/combat/weapons" +#define FILE_DIR "code/game/mecha/equipment" +#define FILE_DIR "code/game/mecha/equipment/tools" +#define FILE_DIR "code/game/mecha/equipment/weapons" #define FILE_DIR "code/game/mecha/working" -#define FILE_DIR "code/game/mecha/working/tools" #define FILE_DIR "code/game/objects" #define FILE_DIR "code/game/objects/alien" #define FILE_DIR "code/game/objects/closets" @@ -429,14 +430,16 @@ #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" #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\weapons\weapons.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" #include "code\game\mecha\working\firefighter.dm" #include "code\game\mecha\working\ripley.dm" #include "code\game\mecha\working\working.dm" -#include "code\game\mecha\working\tools\tools.dm" #include "code\game\objects\assemblies.dm" #include "code\game\objects\blood.dm" #include "code\game\objects\bomb.dm"