mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-20 03:26:37 +01:00
Initial Newmalf port
- Ports TSA Newmalf code. - Complete overhaul of Malfunction. New modular abilities, 12 of which are in game by default. - Adds AI hardware. AI may have only one piece and it gives unique boost in certain area (turrets strength, secondary power supply, etc.) - Adds hardware drivers - these abilities control AI's hardware such as the APU power supply or self destruct explosives. - Station overtake was changed to "hack all APCs" ability instead. When completed self-destruct is unlocked. Timer for station self destruct increased to 2 minutes. AI may activate/deactivate the self destruct at will. Please bear in mind this is only INITIAL COMMIT. More commits are to follow. Minimal player count is now set to 1 but will be 2 when finished.
This commit is contained in:
+56
-76
@@ -83,17 +83,13 @@
|
||||
var/lastused_charging = 0
|
||||
var/lastused_total = 0
|
||||
var/main_status = 0
|
||||
var/mob/living/silicon/ai/hacker = null // Malfunction var. If set AI hacked the APC and has full control.
|
||||
var/wiresexposed = 0
|
||||
powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :(
|
||||
var/malfhack = 0 //New var for my changes to AI malf. --NeoFite
|
||||
var/mob/living/silicon/ai/malfai = null //See above --NeoFite
|
||||
var/debug= 0
|
||||
var/autoflag= 0 // 0 = off, 1= eqp and lights off, 2 = eqp off, 3 = all on.
|
||||
// luminosity = 1
|
||||
var/has_electronics = 0 // 0 - none, 1 - plugged in, 2 - secured by screwdriver
|
||||
var/overload = 1 //used for the Blackout malf module
|
||||
var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment
|
||||
var/mob/living/silicon/ai/occupier = null
|
||||
var/longtermpower = 10
|
||||
var/datum/wires/apc/wires = null
|
||||
var/update_state = -1
|
||||
@@ -170,8 +166,6 @@
|
||||
src.update()
|
||||
|
||||
/obj/machinery/power/apc/Del()
|
||||
if(operating && malf && src.z in config.station_levels) //if (is_type_in_list(get_area(src), the_station_areas))
|
||||
malf.hacked_apcs -= src
|
||||
area.power_light = 0
|
||||
area.power_equip = 0
|
||||
area.power_environ = 0
|
||||
@@ -182,6 +176,10 @@
|
||||
if(terminal)
|
||||
disconnect_terminal()
|
||||
|
||||
// Malf AI, removes the APC from AI's hacked APCs list.
|
||||
if(hacker && hacker.hacked_apcs && src in hacker.hacked_apcs)
|
||||
hacker.hacked_apcs -= src
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/power/apc/proc/make_terminal()
|
||||
@@ -234,8 +232,8 @@
|
||||
else
|
||||
if (stat & MAINT)
|
||||
user << "The cover is closed. Something wrong with it: it doesn't work."
|
||||
else if (malfhack)
|
||||
user << "The cover is broken. It may be hard to force it open."
|
||||
else if (hacker)
|
||||
user << "The cover is locked."
|
||||
else
|
||||
user << "The cover is closed."
|
||||
|
||||
@@ -339,7 +337,7 @@
|
||||
update_state |= UPSTATE_OPENED1
|
||||
if(opened==2)
|
||||
update_state |= UPSTATE_OPENED2
|
||||
else if(emagged || malfai)
|
||||
else if(emagged || hacker)
|
||||
update_state |= UPSTATE_BLUESCREEN
|
||||
else if(wiresexposed)
|
||||
update_state |= UPSTATE_WIREEXP
|
||||
@@ -418,7 +416,7 @@
|
||||
if(do_after(user, 50))
|
||||
if (has_electronics==1)
|
||||
has_electronics = 0
|
||||
if ((stat & BROKEN) || malfhack)
|
||||
if ((stat & BROKEN))
|
||||
user.visible_message(\
|
||||
"<span class='warning'>[user.name] has broken the power control board inside [src.name]!</span>",\
|
||||
"<span class='notice'>You broke the charred power control board and remove the remains.</span>",
|
||||
@@ -432,7 +430,7 @@
|
||||
else if (opened!=2) //cover isn't removed
|
||||
opened = 0
|
||||
update_icon()
|
||||
else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) )
|
||||
else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || hacker) )
|
||||
if(coverlocked && !(stat & MAINT))
|
||||
user << "<span class='warning'>The cover is locked and cannot be opened.</span>"
|
||||
return
|
||||
@@ -491,6 +489,8 @@
|
||||
user << "You must close the panel"
|
||||
else if(stat & (BROKEN|MAINT))
|
||||
user << "Nothing happens."
|
||||
else if(hacker)
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
else
|
||||
if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
@@ -498,7 +498,7 @@
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card
|
||||
else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || hacker)) // trying to unlock with an emag card
|
||||
if(opened)
|
||||
user << "You must close the cover to swipe an ID card."
|
||||
else if(wiresexposed)
|
||||
@@ -560,7 +560,7 @@
|
||||
new /obj/item/stack/cable_coil(loc,10)
|
||||
user << "<span class='notice'>You cut the cables and dismantle the power terminal.</span>"
|
||||
del(terminal) // qdel
|
||||
else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
|
||||
else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN)))
|
||||
user.visible_message("<span class='warning'>[user.name] inserts the power control board into [src].</span>", \
|
||||
"You start to insert the power control board into the frame...")
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
@@ -569,7 +569,7 @@
|
||||
has_electronics = 1
|
||||
user << "<span class='notice'>You place the power control board inside the frame.</span>"
|
||||
del(W) // qdel
|
||||
else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack))
|
||||
else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN)))
|
||||
user << "<span class='warning'>You cannot put the board inside, the frame is damaged.</span>"
|
||||
return
|
||||
else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal)
|
||||
@@ -583,7 +583,7 @@
|
||||
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
||||
if(do_after(user, 50))
|
||||
if(!src || !WT.remove_fuel(3, user)) return
|
||||
if (emagged || malfhack || (stat & BROKEN) || opened==2)
|
||||
if (emagged || (stat & BROKEN) || opened==2)
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
user.visible_message(\
|
||||
"<span class='warning'>[src] has been cut apart by [user.name] with the weldingtool.</span>",\
|
||||
@@ -606,7 +606,7 @@
|
||||
"<span class='notice'>You replace the damaged APC frontal panel with a new one.</span>")
|
||||
del(W) // qdel
|
||||
update_icon()
|
||||
else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack))
|
||||
else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || hacker))
|
||||
if (has_electronics)
|
||||
user << "<span class='warning'>You cannot repair this APC until you remove the electronics still inside.</span>"
|
||||
return
|
||||
@@ -618,13 +618,12 @@
|
||||
"You replace the damaged APC frame with new one.")
|
||||
del(W) // qdel
|
||||
stat &= ~BROKEN
|
||||
malfai = null
|
||||
malfhack = 0
|
||||
hacker = null
|
||||
if (opened==2)
|
||||
opened = 1
|
||||
update_icon()
|
||||
else
|
||||
if (((stat & BROKEN) || malfhack) \
|
||||
if (((stat & BROKEN) || hacker) \
|
||||
&& !opened \
|
||||
&& W.force >= 5 \
|
||||
&& W.w_class >= 3.0 \
|
||||
@@ -736,7 +735,7 @@
|
||||
|
||||
return ui_interact(user)
|
||||
|
||||
|
||||
/*
|
||||
/obj/machinery/power/apc/proc/get_malf_status(mob/user)
|
||||
if (malf && (user.mind in malf.current_antagonists) && istype(user, /mob/living/silicon/ai))
|
||||
if (src.malfai == (user:parent ? user:parent : user))
|
||||
@@ -750,7 +749,7 @@
|
||||
return 1 // 1 = APC not hacked.
|
||||
else
|
||||
return 0 // 0 = User is not a Malf AI
|
||||
|
||||
*/
|
||||
|
||||
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
if(!user)
|
||||
@@ -767,7 +766,7 @@
|
||||
"totalCharging" = round(lastused_charging),
|
||||
"coverLocked" = coverlocked,
|
||||
"siliconUser" = istype(user, /mob/living/silicon),
|
||||
"malfStatus" = get_malf_status(user),
|
||||
/*"malfStatus" = get_malf_status(user),*/
|
||||
|
||||
"powerChannels" = list(
|
||||
list(
|
||||
@@ -857,23 +856,22 @@
|
||||
return 0
|
||||
autoflag = 5
|
||||
if (istype(user, /mob/living/silicon))
|
||||
var/permit = 0 // Malfunction variable. If AI hacks APC it can control it even without AI control wire.
|
||||
var/mob/living/silicon/ai/AI = user
|
||||
var/mob/living/silicon/robot/robot = user
|
||||
if ( \
|
||||
src.aidisabled || \
|
||||
malfhack && istype(malfai) && \
|
||||
( \
|
||||
(istype(AI) && (malfai!=AI && malfai != AI.parent)) || \
|
||||
(istype(robot) && (robot in malfai.connected_robots)) \
|
||||
) \
|
||||
)
|
||||
if(hacker)
|
||||
if(hacker == AI)
|
||||
permit = 1
|
||||
else if(istype(robot) && robot.connected_ai && robot.connected_ai == hacker) // Cyborgs can use APCs hacked by their AI
|
||||
permit = 1
|
||||
|
||||
if(aidisabled && !permit)
|
||||
if(!loud)
|
||||
user << "<span class='danger'>\The [src] have AI control disabled!</span>"
|
||||
return 0
|
||||
else
|
||||
if ((!in_range(src, user) || !istype(src.loc, /turf)))
|
||||
if ((!in_range(src, user) || !istype(src.loc, /turf) || hacker)) // AI-hacked APCs cannot be controlled by other AIs, unlinked cyborgs or humans.
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if (istype(H))
|
||||
if(H.getBrainLoss() >= 60)
|
||||
@@ -930,28 +928,6 @@
|
||||
if(istype(usr, /mob/living/silicon))
|
||||
src.overload_lighting()
|
||||
|
||||
else if (href_list["malfhack"])
|
||||
var/mob/living/silicon/ai/malfai = usr
|
||||
if(get_malf_status(malfai)==1)
|
||||
if (malfai.malfhacking)
|
||||
malfai << "You are already hacking an APC."
|
||||
return 1
|
||||
malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process."
|
||||
malfai.malfhack = src
|
||||
malfai.malfhacking = 1
|
||||
sleep(600)
|
||||
if(src)
|
||||
if (!src.aidisabled)
|
||||
malfai.malfhack = null
|
||||
malfai.malfhacking = 0
|
||||
locked = 1
|
||||
if(usr:parent)
|
||||
src.malfai = usr:parent
|
||||
else
|
||||
src.malfai = usr
|
||||
malfai << "Hack complete. The APC is now under your exclusive control."
|
||||
update_icon()
|
||||
|
||||
else if (href_list["toggleaccess"])
|
||||
if(istype(usr, /mob/living/silicon))
|
||||
if(emagged || (stat & (BROKEN|MAINT)))
|
||||
@@ -968,25 +944,21 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/power/apc/proc/ion_act()
|
||||
//intended to be exactly the same as an AI malf attack
|
||||
if(!src.malfhack && src.z in config.station_levels)
|
||||
if(prob(3))
|
||||
src.locked = 1
|
||||
if (src.cell.charge > 0)
|
||||
// world << "\red blew APC in [src.loc.loc]"
|
||||
src.cell.charge = 0
|
||||
cell.corrupt()
|
||||
src.malfhack = 1
|
||||
update_icon()
|
||||
var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
|
||||
smoke.set_up(3, 0, src.loc)
|
||||
smoke.attach(src)
|
||||
smoke.start()
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
visible_message("<span class='danger'>The [src.name] suddenly lets out a blast of smoke and some sparks!</span>", \
|
||||
"<span class='danger'>You hear sizzling electronics.</span>")
|
||||
if(prob(3))
|
||||
src.locked = 1
|
||||
if (src.cell.charge > 0)
|
||||
src.cell.charge = 0
|
||||
cell.corrupt()
|
||||
update_icon()
|
||||
var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
|
||||
smoke.set_up(3, 0, src.loc)
|
||||
smoke.attach(src)
|
||||
smoke.start()
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
visible_message("<span class='danger'>The [src.name] suddenly lets out a blast of smoke and some sparks!</span>", \
|
||||
"<span class='danger'>You hear sizzling electronics.</span>")
|
||||
|
||||
|
||||
/obj/machinery/power/apc/surplus()
|
||||
@@ -1189,8 +1161,6 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
|
||||
/obj/machinery/power/apc/emp_act(severity)
|
||||
if(cell)
|
||||
cell.emp_act(severity)
|
||||
if(occupier)
|
||||
occupier.emp_act(severity)
|
||||
|
||||
lighting = 0
|
||||
equipment = 0
|
||||
@@ -1266,4 +1236,14 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
|
||||
else
|
||||
return 0
|
||||
|
||||
// Malfunction: Transfers APC under AI's control
|
||||
/obj/machinery/power/apc/proc/ai_hack(var/mob/living/silicon/ai/A = null)
|
||||
if(!A || !A.hacked_apcs || hacker || aidisabled || A.stat == DEAD)
|
||||
return 0
|
||||
src.hacker = A
|
||||
A.hacked_apcs += src
|
||||
locked = 1
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
#undef APC_UPDATE_ICON_COOLDOWN
|
||||
|
||||
Reference in New Issue
Block a user