mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
Merge pull request #8515 from Kyep/depot
Reworks Syndicate Supply Depot
This commit is contained in:
@@ -17,8 +17,8 @@
|
||||
if(announce)
|
||||
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering)
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot)
|
||||
|
||||
for(var/obj/machinery/power/smes/S in machines)
|
||||
var/area/current_area = get_area(S)
|
||||
@@ -41,8 +41,8 @@
|
||||
C.cell.charge = 0
|
||||
|
||||
/proc/power_restore(var/announce = 1)
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering)
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot)
|
||||
|
||||
if(announce)
|
||||
event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
|
||||
@@ -95,8 +95,9 @@
|
||||
sideslist = list("valid", "salad")
|
||||
credits = 20
|
||||
|
||||
/obj/item/coin/antagtoken/New()
|
||||
return
|
||||
/obj/item/coin/antagtoken/syndicate
|
||||
name = "syndicate coin"
|
||||
credits = 160
|
||||
|
||||
/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/mob/living/silicon/decoy/death(gibbed)
|
||||
if(stat == DEAD) return
|
||||
if(stat == DEAD)
|
||||
return
|
||||
stat = DEAD
|
||||
icon_state = "ai-crash"
|
||||
spawn(10)
|
||||
explosion(loc, 3, 6, 12, 15)
|
||||
|
||||
for(var/obj/machinery/ai_status_display/O in world) //change status
|
||||
O.mode = 2
|
||||
return ..(gibbed)
|
||||
if(atoms_share_level(O, src))
|
||||
O.mode = 2
|
||||
..(0)
|
||||
gib()
|
||||
@@ -4,9 +4,54 @@
|
||||
icon_state = "ai"
|
||||
anchored = 1 // -- TLE
|
||||
canmove = 0
|
||||
a_intent = INTENT_HARM // This is apparently the only thing that stops other mobs walking through them as if they were thin air.
|
||||
|
||||
/mob/living/silicon/decoy/New()
|
||||
src.icon = 'icons/mob/AI.dmi'
|
||||
src.icon_state = "ai"
|
||||
src.anchored = 1
|
||||
src.canmove = 0
|
||||
src.canmove = 0
|
||||
|
||||
/mob/living/silicon/decoy/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/aicard))
|
||||
to_chat(user, "<span class='warning'>You cannot find an intellicard slot on [src].</span>")
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/decoy/syndicate
|
||||
faction = list("syndicate")
|
||||
name = "R.O.D.G.E.R"
|
||||
desc = "Red Operations, Depot General Emission Regulator"
|
||||
icon_state = "ai-magma"
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/New()
|
||||
. = ..()
|
||||
icon_state = "ai-magma"
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/depot
|
||||
var/raised_alert = FALSE
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/depot/proc/raise_alert()
|
||||
raised_alert = TRUE
|
||||
var/area/syndicate_depot/core/depotarea = get_area(src) // Cannot use myArea or areaMaster as neither will be defined for this mob type
|
||||
if(istype(depotarea))
|
||||
depotarea.increase_alert("AI Unit Offline")
|
||||
else
|
||||
say("Connection failure!")
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/depot/death(pass)
|
||||
if(!raised_alert)
|
||||
raise_alert()
|
||||
. = ..(pass)
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/depot/adjustBruteLoss(dmg)
|
||||
. = ..(dmg)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/depot/adjustFireLoss(dmg)
|
||||
. = ..(dmg)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/decoy/syndicate/depot/ex_act(severity)
|
||||
adjustBruteLoss(250)
|
||||
@@ -1,10 +1,5 @@
|
||||
/mob/living/silicon/decoy/Life(seconds, times_fired)
|
||||
if(src.stat == 2)
|
||||
return
|
||||
else
|
||||
if(src.health <= config.health_threshold_dead && src.stat != 2)
|
||||
death()
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
/mob/living/silicon/decoy/updatehealth()
|
||||
@@ -13,3 +8,11 @@
|
||||
stat = CONSCIOUS
|
||||
else
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
|
||||
update_stat()
|
||||
|
||||
|
||||
/mob/living/silicon/decoy/update_stat()
|
||||
if(stat == DEAD)
|
||||
return
|
||||
if(health <= 0)
|
||||
death()
|
||||
@@ -204,6 +204,10 @@
|
||||
if(disabled)
|
||||
return
|
||||
|
||||
ed209_ai()
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/ed209_ai()
|
||||
var/list/targets = list()
|
||||
for(var/mob/living/carbon/C in view(7, src)) //Let's find us a target
|
||||
var/threatlevel = 0
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
|
||||
var/shut_up = 0 //self explanatory :)
|
||||
var/syndicate_aligned = FALSE // Will it only treat operatives?
|
||||
var/drops_parts = TRUE
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/tox
|
||||
skin = "tox"
|
||||
@@ -77,6 +78,7 @@
|
||||
name = "Suspicious Medibot"
|
||||
desc = "You'd better have insurance!"
|
||||
skin = "bezerk"
|
||||
faction = list("syndicate")
|
||||
treatment_oxy = "perfluorodecalin"
|
||||
treatment_brute = "bicaridine"
|
||||
treatment_fire = "kelotane"
|
||||
@@ -91,6 +93,11 @@
|
||||
..()
|
||||
Radio.syndie = 1
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/syndicate/emagged
|
||||
emagged = 2
|
||||
declare_crit = 0
|
||||
drops_parts = FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/update_icon()
|
||||
overlays.Cut()
|
||||
if(skin)
|
||||
@@ -554,36 +561,37 @@
|
||||
visible_message("<span class='userdanger'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
switch(skin)
|
||||
if("ointment")
|
||||
new /obj/item/storage/firstaid/fire/empty(Tsec)
|
||||
if("tox")
|
||||
new /obj/item/storage/firstaid/toxin/empty(Tsec)
|
||||
if("o2")
|
||||
new /obj/item/storage/firstaid/o2/empty(Tsec)
|
||||
if("brute")
|
||||
new /obj/item/storage/firstaid/brute/empty(Tsec)
|
||||
if("adv")
|
||||
new /obj/item/storage/firstaid/adv/empty(Tsec)
|
||||
if("bezerk")
|
||||
var/obj/item/storage/firstaid/tactical/empty/T = new(Tsec)
|
||||
T.syndicate_aligned = syndicate_aligned //This is a special case since Syndicate medibots and the mysterious medibot look the same; we also dont' want crew building Syndicate medibots if the mysterious medibot blows up.
|
||||
if("fish")
|
||||
new /obj/item/storage/firstaid/aquatic_kit(Tsec)
|
||||
else
|
||||
new /obj/item/storage/firstaid(Tsec)
|
||||
if(drops_parts)
|
||||
switch(skin)
|
||||
if("ointment")
|
||||
new /obj/item/storage/firstaid/fire/empty(Tsec)
|
||||
if("tox")
|
||||
new /obj/item/storage/firstaid/toxin/empty(Tsec)
|
||||
if("o2")
|
||||
new /obj/item/storage/firstaid/o2/empty(Tsec)
|
||||
if("brute")
|
||||
new /obj/item/storage/firstaid/brute/empty(Tsec)
|
||||
if("adv")
|
||||
new /obj/item/storage/firstaid/adv/empty(Tsec)
|
||||
if("bezerk")
|
||||
var/obj/item/storage/firstaid/tactical/empty/T = new(Tsec)
|
||||
T.syndicate_aligned = syndicate_aligned //This is a special case since Syndicate medibots and the mysterious medibot look the same; we also dont' want crew building Syndicate medibots if the mysterious medibot blows up.
|
||||
if("fish")
|
||||
new /obj/item/storage/firstaid/aquatic_kit(Tsec)
|
||||
else
|
||||
new /obj/item/storage/firstaid(Tsec)
|
||||
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
|
||||
new /obj/item/healthanalyzer(Tsec)
|
||||
new /obj/item/healthanalyzer(Tsec)
|
||||
|
||||
if(prob(50))
|
||||
new /obj/item/robot_parts/l_arm(Tsec)
|
||||
|
||||
if(reagent_glass)
|
||||
reagent_glass.forceMove(Tsec)
|
||||
reagent_glass = null
|
||||
|
||||
if(prob(50))
|
||||
new /obj/item/robot_parts/l_arm(Tsec)
|
||||
|
||||
if(emagged && prob(25))
|
||||
playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
|
||||
|
||||
|
||||
@@ -0,0 +1,216 @@
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate
|
||||
name = "Syndicate Sentry Bot"
|
||||
desc = "A syndicate security bot."
|
||||
model = "Guardian"
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "darkgygax"
|
||||
radio_channel = "Syndicate"
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
declare_arrests = 0
|
||||
idcheck = 1
|
||||
arrest_type = 1
|
||||
auto_patrol = 1
|
||||
emagged = 2
|
||||
faction = list("syndicate")
|
||||
shoot_sound = 'sound/weapons/wave.ogg'
|
||||
anchored = 1
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120
|
||||
window_id = "syndiebot"
|
||||
window_name = "Syndicate Bot Interface"
|
||||
var/turf/saved_turf
|
||||
var/stepsound = 'sound/mecha/mechstep.ogg'
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/raised_alert = FALSE
|
||||
var/pathing_failed = FALSE
|
||||
var/turf/spawn_turf
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/New()
|
||||
..()
|
||||
if(access_card)
|
||||
access_card.access = list(access_syndicate, access_syndicate_leader)
|
||||
set_weapon()
|
||||
update_icon()
|
||||
spawn_turf = get_turf(src)
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/turn_on()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/turn_off()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/get_controls(mob/user)
|
||||
to_chat(user, "<span class='warning'>[src] has no accessible control panel!</span>")
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/show_controls(mob/M)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/Topic(href, href_list)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/retaliate(mob/living/carbon/human/H)
|
||||
if(!H)
|
||||
return
|
||||
target = H
|
||||
mode = BOT_HUNT
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/emag_act(mob/user)
|
||||
to_chat(user, "<span class='warning'>[src] has no card reader slot!</span>")
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/ed209_ai()
|
||||
var/turf/current_turf = get_turf(src)
|
||||
if(saved_turf && current_turf != saved_turf)
|
||||
playsound(loc, stepsound, 40, 1)
|
||||
if(spawn_turf && !atoms_share_level(src, spawn_turf))
|
||||
raise_alert("[src] lost in space.")
|
||||
raised_alert = FALSE
|
||||
raise_alert("[src] activated self-destruct.")
|
||||
qdel(src)
|
||||
saved_turf = current_turf
|
||||
switch(mode)
|
||||
if(BOT_IDLE)
|
||||
walk_to(src,0)
|
||||
look_for_perp()
|
||||
if(!mode && auto_patrol)
|
||||
mode = BOT_START_PATROL
|
||||
if(BOT_HUNT)
|
||||
if(frustration >= 8)
|
||||
walk_to(src,0)
|
||||
back_to_idle()
|
||||
if(target)
|
||||
if(isliving(target))
|
||||
if(target.stat == DEAD)
|
||||
back_to_idle()
|
||||
return
|
||||
shootAt(target)
|
||||
var/turf/olddist = get_dist(src, target)
|
||||
walk_to(src, target,1,4)
|
||||
if((get_dist(src, target)) >= (olddist))
|
||||
frustration++
|
||||
else
|
||||
frustration = 0
|
||||
else
|
||||
back_to_idle()
|
||||
if(BOT_START_PATROL)
|
||||
look_for_perp()
|
||||
start_patrol()
|
||||
if(BOT_PATROL)
|
||||
look_for_perp()
|
||||
bot_patrol()
|
||||
else
|
||||
back_to_idle()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/look_for_perp()
|
||||
if(disabled)
|
||||
return
|
||||
for(var/mob/M in view(7, src))
|
||||
if(M.invisibility > see_invisible)
|
||||
continue
|
||||
if("syndicate" in M.faction)
|
||||
continue
|
||||
if(M.stat == DEAD)
|
||||
continue
|
||||
if((M.name == oldtarget_name) && (world.time < last_found + 100))
|
||||
continue
|
||||
target = M
|
||||
oldtarget_name = M.name
|
||||
mode = BOT_HUNT
|
||||
spawn(0)
|
||||
handle_automated_action()
|
||||
break
|
||||
for(var/obj/spacepod/P in view(7, src))
|
||||
if((P.name == oldtarget_name) && (world.time < last_found + 100))
|
||||
continue
|
||||
if(!P.pilot)
|
||||
continue
|
||||
if("syndicate" in P.pilot.faction)
|
||||
continue
|
||||
if(P.pilot.stat == DEAD)
|
||||
continue
|
||||
target = P
|
||||
oldtarget_name = P.name
|
||||
mode = BOT_HUNT
|
||||
spawn(0)
|
||||
handle_automated_action()
|
||||
break
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/shootAt(atom/target)
|
||||
if(lastfired && world.time - lastfired < shot_delay)
|
||||
return
|
||||
lastfired = world.time
|
||||
var/obj/item/projectile/P = new projectile(loc)
|
||||
playsound(loc, shoot_sound, 100, 1)
|
||||
P.current = loc
|
||||
P.starting = loc
|
||||
P.firer = src
|
||||
P.yo = target.y - loc.y
|
||||
P.xo = target.x - loc.x
|
||||
P.original = target
|
||||
P.fire()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/explode()
|
||||
if (!QDELETED(src))
|
||||
if(depotarea)
|
||||
depotarea.list_remove(src, depotarea.guard_list)
|
||||
walk_to(src,0)
|
||||
visible_message("<span class='userdanger'>[src] blows apart!</span>")
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
var/obj/effect/decal/mecha_wreckage/gygax/dark/wreck = new /obj/effect/decal/mecha_wreckage/gygax/dark(loc)
|
||||
wreck.name = "sentry bot wreckage"
|
||||
|
||||
raise_alert("[src] destroyed.")
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/set_weapon()
|
||||
projectile = /obj/item/projectile/bullet/a40mm
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/emp_act(severity)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/UnarmedAttack(atom/A)
|
||||
if(!on)
|
||||
return
|
||||
shootAt(A)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/cuff(mob/living/carbon/C)
|
||||
shootAt(C)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/stun_attack(mob/living/carbon/C)
|
||||
shootAt(C)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/speak()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/start_patrol()
|
||||
if(tries >= BOT_STEP_MAX_RETRIES)
|
||||
if(!pathing_failed)
|
||||
pathing_failed = TRUE
|
||||
var/failmsg = "Depot: [src] at [loc.x],[loc.y],[loc.z] lacks patrol target."
|
||||
if(istype(patrol_target))
|
||||
failmsg = "Depot: [src] at [loc.x],[loc.y],[loc.z] cannot reach [patrol_target.x],[patrol_target.y]"
|
||||
log_debug(failmsg)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/proc/raise_alert(reason)
|
||||
if(raised_alert)
|
||||
return
|
||||
raised_alert = TRUE
|
||||
if(depotarea)
|
||||
depotarea.increase_alert(reason)
|
||||
@@ -115,6 +115,11 @@
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
|
||||
/obj/effect/landmark/mobcorpse/syndicateautogib/createCorpse()
|
||||
var/mob/living/carbon/human/M = new /mob/living/carbon/human(loc)
|
||||
M.real_name = src.name
|
||||
M.gib()
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse/clown
|
||||
|
||||
@@ -39,17 +39,20 @@
|
||||
armour_penetration = 28
|
||||
status_flags = 0
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
|
||||
var/melee_block_chance = 20
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
if(O.force)
|
||||
if(prob(80))
|
||||
if(prob(melee_block_chance))
|
||||
visible_message("<span class='boldwarning'>[src] blocks the [O] with its shield! </span>")
|
||||
else
|
||||
var/damage = O.force
|
||||
if(O.damtype == STAMINA)
|
||||
damage = 0
|
||||
health -= damage
|
||||
visible_message("<span class='boldwarning'>[src] has been attacked with the [O] by [user]. </span>")
|
||||
else
|
||||
visible_message("<span class='boldwarning'>[src] blocks the [O] with its shield! </span>")
|
||||
playsound(loc, O.hitsound, 25, 1, -1)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
|
||||
@@ -65,19 +68,182 @@
|
||||
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicateautogib)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot
|
||||
name = "Syndicate Operative"
|
||||
force_threshold = 6 // Prevents people using punches to bypass eshield
|
||||
robust_searching = 1 // Together with stat_attack, ensures dionae/etc that regen are killed properly
|
||||
stat_attack = 1
|
||||
universal_speak = 1
|
||||
melee_block_chance = 40
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/raised_alert = FALSE
|
||||
var/alert_on_death = FALSE
|
||||
var/alert_on_timeout = FALSE
|
||||
var/alert_on_spacing = TRUE
|
||||
var/alert_on_shield_breach = FALSE
|
||||
var/seen_enemy = FALSE
|
||||
var/seen_enemy_name = null
|
||||
var/seen_revived_enemy = FALSE
|
||||
var/aggro_cycles = 0
|
||||
var/scan_cycles = 0
|
||||
var/shield_key = FALSE
|
||||
var/turf/spawn_turf
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/New()
|
||||
..()
|
||||
name = "[name] [pick(last_names)]"
|
||||
depotarea = areaMaster
|
||||
spawn_turf = get_turf(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/Aggro()
|
||||
. = ..()
|
||||
if(target && istype(depotarea))
|
||||
if(!seen_enemy)
|
||||
seen_enemy = TRUE
|
||||
playsound(loc, 'sound/weapons/saberon.ogg', 35, 1)
|
||||
if(alert_on_shield_breach)
|
||||
if(depotarea.shield_list.len)
|
||||
raise_alert("[name] reports that an intruder is trying to breach the armory shield!")
|
||||
alert_on_shield_breach = FALSE
|
||||
raised_alert = FALSE
|
||||
alert_on_death = TRUE
|
||||
if(isliving(target))
|
||||
var/mob/living/M = target
|
||||
depotarea.list_add(M, depotarea.hostile_list)
|
||||
if(M.mind && M.mind.special_role == SPECIAL_ROLE_TRAITOR)
|
||||
depotarea.saw_double_agent(M)
|
||||
depotarea.declare_started()
|
||||
seen_enemy_name = target.name
|
||||
if(istype(target, /obj/mecha))
|
||||
depotarea.saw_mech(target)
|
||||
if(istype(target, /obj/spacepod))
|
||||
depotarea.saw_pod(target)
|
||||
if(depotarea.list_includes(target, depotarea.dead_list))
|
||||
seen_revived_enemy = TRUE
|
||||
raise_alert("[name] reports intruder [target] has returned from death!")
|
||||
depotarea.list_remove(target, depotarea.dead_list)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action()
|
||||
if(seen_enemy)
|
||||
aggro_cycles++
|
||||
if(alert_on_timeout && !raised_alert && aggro_cycles >= 60)
|
||||
raise_alert("[name] has reported contact with hostile entity: [seen_enemy_name]")
|
||||
if(scan_cycles >= 15 && istype(depotarea))
|
||||
scan_cycles = 0
|
||||
if(!atoms_share_level(src, spawn_turf))
|
||||
if(alert_on_spacing)
|
||||
raise_alert("[src] lost in space.")
|
||||
death()
|
||||
return
|
||||
for(var/mob/living/body in hearers(vision_range, targets_from))
|
||||
if(body.stat != DEAD)
|
||||
continue
|
||||
if(depotarea.list_includes(body, depotarea.dead_list))
|
||||
continue
|
||||
if(faction_check(body))
|
||||
continue
|
||||
say("Target [body]... terminated.")
|
||||
depotarea.list_add(body, depotarea.dead_list)
|
||||
pointed(body)
|
||||
else
|
||||
scan_cycles++
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/proc/raise_alert(var/reason)
|
||||
if(istype(depotarea) && (!raised_alert || seen_revived_enemy) && !depotarea.used_self_destruct)
|
||||
raised_alert = TRUE
|
||||
say("Intruder!")
|
||||
depotarea.increase_alert(reason)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/death()
|
||||
if(alert_on_death)
|
||||
if(seen_enemy_name)
|
||||
raise_alert("[name] has died in combat with [seen_enemy_name].")
|
||||
else
|
||||
raise_alert("[name] has died.")
|
||||
if(shield_key && depotarea)
|
||||
depotarea.shields_key_check()
|
||||
if(depotarea)
|
||||
depotarea.list_remove(src, depotarea.guard_list)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
if(isliving(mover))
|
||||
var/mob/living/blocker = mover
|
||||
if(faction_check(blocker))
|
||||
return 1
|
||||
return ..(mover, target, height)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer
|
||||
name = "Syndicate Officer"
|
||||
alert_on_death = TRUE
|
||||
alert_on_timeout = TRUE
|
||||
melee_block_chance = 60
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory
|
||||
name = "Syndicate Quartermaster"
|
||||
icon_state = "syndicatemeleespace"
|
||||
icon_living = "syndicatemeleespace"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
melee_block_chance = 80
|
||||
alert_on_timeout = TRUE
|
||||
alert_on_shield_breach = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death()
|
||||
if(depotarea)
|
||||
depotarea.declare_finished()
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize()
|
||||
. = ..()
|
||||
if(istype(depotarea))
|
||||
var/list/key_candidates = list()
|
||||
for(var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O in living_mob_list)
|
||||
if(O == src)
|
||||
continue
|
||||
key_candidates += O
|
||||
if(key_candidates.len)
|
||||
var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O = pick(key_candidates)
|
||||
O.shield_key = TRUE
|
||||
depotarea.shields_up()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space
|
||||
name = "Syndicate Backup"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
icon_state = "syndicatemeleespace"
|
||||
icon_living = "syndicatemeleespace"
|
||||
speed = 1
|
||||
wander = 0
|
||||
alert_on_spacing = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space
|
||||
name = "Syndicate Commando"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
icon_state = "syndicatemeleespace"
|
||||
icon_living = "syndicatemeleespace"
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
@@ -97,10 +263,11 @@
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/gun/projectile/automatic/c20r)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicateautogib)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/viscerator
|
||||
|
||||
@@ -121,3 +121,12 @@
|
||||
..()
|
||||
new /obj/item/documents/syndicate/blue(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/folder/syndicate/yellow
|
||||
icon_state = "folder_syellow"
|
||||
|
||||
/obj/item/folder/syndicate/yellow/full/New()
|
||||
..()
|
||||
new /obj/item/documents/syndicate/yellow(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
..()
|
||||
select_fire(usr)
|
||||
|
||||
/obj/item/gun/energy/wormhole_projector/proc/portal_destroyed(obj/effect/portal/P)
|
||||
/obj/item/gun/energy/wormhole_projector/portal_destroyed(obj/effect/portal/P)
|
||||
if(P.icon_state == "portal")
|
||||
blue = null
|
||||
if(orange)
|
||||
|
||||
@@ -557,11 +557,14 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v
|
||||
|
||||
/obj/spacepod/syndi
|
||||
name = "syndicate spacepod"
|
||||
desc = "An armed spacepod painted in syndicate colors."
|
||||
desc = "A spacepod painted in syndicate colors."
|
||||
icon_state = "pod_synd"
|
||||
health = 400
|
||||
unlocked = FALSE
|
||||
|
||||
/obj/spacepod/syndi/unlocked
|
||||
unlocked = TRUE
|
||||
|
||||
/obj/spacepod/sec/New()
|
||||
..()
|
||||
var/obj/item/spacepod_equipment/weaponry/burst_taser/T = new /obj/item/spacepod_equipment/weaponry/taser
|
||||
|
||||
Reference in New Issue
Block a user