From b4a323ec386364f35f9241bdbf259184895e9b2c Mon Sep 17 00:00:00 2001 From: Mechoid Date: Fri, 29 Sep 2017 20:29:30 -0700 Subject: [PATCH 1/2] Fixes Brain-Mechs, and a tangentially related MMI runtime. --- code/game/mecha/combat/combat.dm | 10 ++- code/game/mecha/equipment/tools/tools.dm | 2 +- code/game/mecha/mecha.dm | 79 ++++++++++++++++++++- code/modules/mob/living/carbon/brain/MMI.dm | 3 +- 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 5424882adc..7651766f3f 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -25,7 +25,7 @@ if(!melee_can_hit || !istype(target, /atom)) return if(istype(target, /mob/living)) var/mob/living/M = target - if(src.occupant.a_intent == I_HURT) + if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) //Brains cannot change intents; Exo-piloting brains lack any form of physical feedback for control, limiting the ability to 'play nice'. playsound(src, 'sound/weapons/punch4.ogg', 50, 1) if(damtype == "brute") step_away(M,src,15) @@ -244,6 +244,14 @@ else return 0 +/obj/mecha/combat/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) + if(..()) + if(occupant.client) + occupant.client.mouse_pointer_icon = file("icons/mecha/mecha_mouse.dmi") + return 1 + else + return 0 + /obj/mecha/combat/go_out() if(src.occupant && src.occupant.client) src.occupant.client.mouse_pointer_icon = initial(src.occupant.client.mouse_pointer_icon) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index a1cbba3102..f3df144ea7 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -52,7 +52,7 @@ else if(istype(target,/mob/living)) var/mob/living/M = target if(M.stat>1) return - if(chassis.occupant.a_intent == I_HURT) + if(chassis.occupant.a_intent == I_HURT || istype(chassis.occupant,/mob/living/carbon/brain)) //No tactile feedback for brains M.take_overall_damage(dam_force) M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index dd3940d421..ce84a6bcf4 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -344,8 +344,11 @@ /obj/mecha/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. + if(istype(user,/mob/living/carbon/brain)) + to_chat(user,"You try to move, but you are not the pilot! The exosuit doesn't respond.") + return 0 user.forceMove(get_turf(src)) - user << "You climb out from [src]" + to_chat(user,"You climb out from [src]") return 0 if(connected_port) if(world.time - last_message > 20) @@ -686,6 +689,13 @@ /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/mmi)) + if(mmi_move_inside(W,user)) + to_chat(user,"[src]-MMI interface initialized successfuly") + else + to_chat(user,"[src]-MMI interface initialization failed.") + return + if(istype(W, /obj/item/mecha_parts/mecha_equipment)) var/obj/item/mecha_parts/mecha_equipment/E = W spawn() @@ -829,6 +839,70 @@ return */ +/////////////////////////////// +//////// Brain Stuff //////// +/////////////////////////////// + +/obj/mecha/proc/mmi_move_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) + if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) + to_chat(user,"Consciousness matrix not detected.") + return 0 + else if(mmi_as_oc.brainmob.stat) + to_chat(user,"Brain activity below acceptable level.") + return 0 + else if(occupant) + to_chat(user,"Occupant detected.") + return 0 + else if(dna && dna!=mmi_as_oc.brainmob.dna.unique_enzymes) + to_chat(user,"Genetic sequence or serial number incompatible with locking mechanism.") + return 0 + //Added a message here since people assume their first click failed or something./N +// user << "Installing MMI, please stand by." + + visible_message("[usr] starts to insert a brain into [src.name]") + + if(enter_after(40,user)) + if(!occupant) + return mmi_moved_inside(mmi_as_oc,user) + else + to_chat(user,"Occupant detected.") + else + to_chat(user,"You stop attempting to install the brain.") + return 0 + +/obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) + if(mmi_as_oc && user in range(1)) + if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) + user << "Consciousness matrix not detected." + return 0 + else if(mmi_as_oc.brainmob.stat) + user << "Beta-rhythm below acceptable level." + return 0 + user.drop_from_inventory(mmi_as_oc) + var/mob/brainmob = mmi_as_oc.brainmob + brainmob.reset_view(src) + /* + brainmob.client.eye = src + brainmob.client.perspective = EYE_PERSPECTIVE + */ + occupant = brainmob + brainmob.loc = src //should allow relaymove + brainmob.canmove = 1 + mmi_as_oc.loc = src + mmi_as_oc.mecha = src + src.verbs += /obj/mecha/verb/eject + src.Entered(mmi_as_oc) + src.Move(src.loc) + src.icon_state = src.reset_icon() + set_dir(dir_in) + src.log_message("[mmi_as_oc] moved in as pilot.") + if(!hasInternalDamage()) + src.occupant << sound('sound/mecha/nominal.ogg',volume=50) + return 1 + else + return 0 + + ///////////////////////////////////// //////// Atmospheric stuff //////// ///////////////////////////////////// @@ -1044,6 +1118,7 @@ src.occupant = H src.add_fingerprint(H) src.forceMove(src.loc) + src.verbs += /obj/mecha/verb/eject src.log_append_to_last("[H] moved in as pilot.") src.icon_state = src.reset_icon() set_dir(dir_in) @@ -1132,10 +1207,10 @@ occupant.loc = mmi mmi.mecha = null src.occupant.canmove = 0 - src.verbs += /obj/mecha/verb/eject src.occupant = null src.icon_state = src.reset_icon()+"-open" src.set_dir(dir_in) + src.verbs -= /obj/mecha/verb/eject return ///////////////////////// diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index afdfe7a6d7..aa057c04c8 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -128,7 +128,8 @@ return var/obj/item/weapon/rig/rig = src.get_rig() if(rig) - rig.forced_move(direction, user) + if(istype(rig,/obj/item/weapon/rig)) + rig.forced_move(direction, user) /obj/item/device/mmi/Destroy() if(isrobot(loc)) From 77f0e7514cfff56daf9d0572fc270b087f0ea001 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Fri, 29 Sep 2017 22:10:48 -0700 Subject: [PATCH 2/2] Combat exosuits can now actually punch through walls and girders again, based on their 'force'. Fixes some to_chat's. --- code/game/mecha/combat/combat.dm | 9 +++++++-- code/game/mecha/mecha.dm | 4 ++-- code/game/objects/structures/girders.dm | 6 ++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 7651766f3f..77087ed32f 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -2,7 +2,7 @@ force = 30 var/melee_cooldown = 10 var/melee_can_hit = 1 - var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall) + var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall, /obj/structure/girder) internal_damage_threshold = 50 maint_access = 0 //add_req_access = 0 @@ -95,14 +95,19 @@ if(istype(target, target_type) && hascall(target, "attackby")) src.occupant_message("You hit [target].") src.visible_message("[src.name] hits [target]") - if(!istype(target, /turf/simulated/wall)) + if(!istype(target, /turf/simulated/wall) && !istype(target, /obj/structure/girder)) target:attackby(src,src.occupant) else if(prob(5)) target:dismantle_wall(1) src.occupant_message("You smash through the wall.") src.visible_message("[src.name] smashes through the wall") playsound(src, 'sound/weapons/smash.ogg', 50, 1) + else if(istype(target, /turf/simulated/wall)) + target:take_damage(force) + else if(istype(target, /obj/structure/girder)) + target:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without. melee_can_hit = 0 + if(do_after(melee_cooldown)) melee_can_hit = 1 break diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index ce84a6bcf4..56149a254c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -873,10 +873,10 @@ /obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(mmi_as_oc && user in range(1)) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - user << "Consciousness matrix not detected." + to_chat(user,"Consciousness matrix not detected.") return 0 else if(mmi_as_oc.brainmob.stat) - user << "Beta-rhythm below acceptable level." + to_chat(user,"Beta-rhythm below acceptable level.") return 0 user.drop_from_inventory(mmi_as_oc) var/mob/brainmob = mmi_as_oc.brainmob diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 14a724e029..37aeef7fd9 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -125,6 +125,12 @@ else return ..() +/obj/structure/girder/proc/take_damage(var/damage) + health -= damage + + if(health <= 0) + dismantle() + /obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user) var/amount_to_use = reinf_material ? 1 : 2 if(S.get_amount() < amount_to_use)