diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 5424882adc..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 @@ -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) @@ -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 @@ -244,6 +249,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..56149a254c 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) + to_chat(user,"Consciousness matrix not detected.") + return 0 + else if(mmi_as_oc.brainmob.stat) + to_chat(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/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) 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))