Adminbus part2

This commit is contained in:
DeityLink
2014-11-14 05:14:13 +01:00
parent 09bf70457a
commit 9e7a697d97
33 changed files with 526 additions and 123 deletions

View File

@@ -1,7 +1,4 @@
//Machinery that gets deleted by Nar-Sie and isn't replaced with cult structures
/obj/machinery/bot/cultify()
qdel(src)
/obj/machinery/camera/cultify()
qdel(src)

View File

@@ -21,6 +21,7 @@
#define CLEAN_BOT 4 // Cleanbots
#define MED_BOT 5 // Medibots
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
var/isolated = 0
/obj/machinery/bot/proc/turn_on()
if(stat) return 0
@@ -58,6 +59,8 @@
return
/obj/machinery/bot/attack_alien(var/mob/living/carbon/alien/user as mob)
if(isolated)
return
src.health -= rand(15,30)*brute_dam_coeff
src.visible_message("\red <B>[user] has slashed [src]!</B>")
playsound(get_turf(src), 'sound/weapons/slice.ogg', 25, 1, -1)
@@ -67,6 +70,8 @@
/obj/machinery/bot/attack_animal(var/mob/living/simple_animal/M as mob)
if(isolated)
return
if(M.melee_damage_upper == 0) return
src.health -= M.melee_damage_upper
src.visible_message("\red <B>[M] has [M.attacktext] [src]!</B>")
@@ -90,6 +95,8 @@
/obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(isolated)
return
if(istype(W, /obj/item/weapon/screwdriver))
if(!locked)
open = !open
@@ -118,20 +125,28 @@
..()
/obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj)
if(isolated)
return
health -= Proj.damage
..()
healthcheck()
/obj/machinery/bot/meteorhit()
if(isolated)
return
src.explode()
return
/obj/machinery/bot/blob_act()
if(isolated)
return
src.health -= rand(20,40)*fire_dam_coeff
healthcheck()
return
/obj/machinery/bot/ex_act(severity)
if(isolated)
return
switch(severity)
if(1.0)
src.explode()
@@ -150,6 +165,8 @@
return
/obj/machinery/bot/emp_act(severity)
if(isolated)
return
var/was_on = on
stat |= EMPED
var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc )
@@ -239,3 +256,10 @@
//if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID)
else return !D.check_access(ID) // it's a real, air blocking door
return 0
/obj/machinery/bot/cultify()
if(src.isolated)
return
else
qdel(src)

View File

@@ -1,3 +1,5 @@
//Deity Link, giving a new meaning to the Adminbus since 2014
/obj/structure/stool/bed/chair/vehicle/adminbus
name = "\improper Adminbus"
desc = "Shit just got fucking real."
@@ -11,6 +13,7 @@
var/list/overlays_bus[3]//1=underlay 2=roadlights 3=ad
var/list/passengers[16]
var/occupied_seats = 0
var/unloading = 0
var/capture_mode = 1//1=capture mobs 2=roll over mobs(deals light brute damage and push them down) 3=gib mobs
var/spawned_mobs[] = list()//keeps track of every mobs spawned by the bus, so we can remove them all with the push of a button in needed
var/hook = 1
@@ -18,6 +21,7 @@
var/obj/structure/singulo_chain/chain_base = null
var/chain[] = list()
var/obj/machinery/singularity/singulo = null
var/roadlights = 0
/obj/structure/stool/bed/chair/vehicle/adminbus/New()
..()
@@ -28,9 +32,9 @@
overlays_bus[2] = roadlights
overlays_bus[3] = advertisement
overlays += overlays_bus[1]
overlays += overlays_bus[2]
overlays += overlays_bus[3]
dir = 4
src.dir = 4
playsound(src, 'sound/misc/adminbus.ogg', 50, 0, 0)
/obj/structure/stool/bed/chair/vehicle/adminbus/update_mob()
if(buckled_mob)
@@ -128,6 +132,11 @@
/obj/structure/stool/bed/chair/vehicle/adminbus/Move()
var/turf/T = get_turf(src)
var/turf/S = get_step(src,src.dir)
for(var/mob/living/M in S)
capture_mob(M)
for(var/obj/machinery/bot/B in S)
capture_mob(B)
..()
if(chain_base)
chain_base.move_child(T)
@@ -136,6 +145,9 @@
if(isliving(A))
var/mob/living/M = A
M.loc = src.loc
else if(isbot(A))
var/obj/machinery/bot/B = A
B.loc = src.loc
for(var/obj/structure/hookshot/H in hookshot)
H.forceMove(get_step(H,src.dir))
@@ -169,6 +181,8 @@
return
/obj/structure/stool/bed/chair/vehicle/adminbus/proc/capture_mob(atom/A)
if(unloading)
return
if(isliving(A))
var/mob/living/M = A
if(M.faction == "admin")
@@ -183,7 +197,17 @@
M.update_canmove()
passengers[occupied_seats] = M
src.add_fingerprint(M)
//else if(isbot(A))
else if(isbot(A))
var/obj/machinery/bot/B = A
if(B.isolated)
return
occupied_seats++
B.turn_off()
B.isolated = 1
B.anchored = 1
B.loc = src.loc
B.dir = src.dir
passengers[occupied_seats] = B
/obj/structure/stool/bed/chair/vehicle/adminbus/buckle_mob(mob/M, mob/user)
if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon) || destroyed)
@@ -204,6 +228,10 @@
buckled_mob = user
update_mob()
add_fingerprint(user)
if(!roadlights)
overlays += overlays_bus[2]
roadlights = 1
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
return
@@ -225,6 +253,9 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
buckled_mob = null
if(roadlights)
overlays -= overlays_bus[2]
roadlights = 0
return
/obj/structure/stool/bed/chair/vehicle/adminbus/emp_act(severity)
@@ -307,6 +338,9 @@
sleep(2)
returnin()
/obj/structure/hookshot/ex_act(severity)
return
/obj/structure/hookshot/cultify()
return
@@ -324,6 +358,9 @@
icon_state = ""
var/obj/machinery/singularity/target = null
/obj/structure/singulo_chain/ex_act(severity)
return
/obj/structure/singulo_chain/proc/move_child(var/turf/parent)
var/turf/T = get_turf(src)
if(parent)//I don't see how this could be null but a sanity check won't hurt

View File

@@ -10,52 +10,52 @@
usr << "Nice try."
return
switch(dir)
if(SOUTH)
for(var/i=1;i<=passengers.len;i++)
var/atom/A = passengers[i]
if(isliving(A))
var/mob/living/L = A
freed(L)
unloading = 1
for(var/i=occupied_seats;i>0;i--)
var/atom/A = passengers[i]
if(isliving(A))
var/mob/living/L = A
switch(dir)
if(SOUTH)
L.x = x-1
sleep(3)
if(WEST)
for(var/i=1;i<=passengers.len;i++)
var/atom/A = passengers[i]
if(isliving(A))
var/mob/living/L = A
freed(L)
if(WEST)
L.y = y+1
sleep(3)
if(NORTH)
for(var/i=1;i<=passengers.len;i++)
var/atom/A = passengers[i]
if(isliving(A))
var/mob/living/L = A
freed(L)
if(NORTH)
L.x = x+1
sleep(3)
if(EAST)
for(var/i=1;i<=passengers.len;i++)
var/atom/A = passengers[i]
if(isliving(A))
var/mob/living/L = A
freed(L)
if(EAST)
L.y = y-1
sleep(3)
for(var/i=1;i<=passengers.len;i++)
freed(L)
else if(isbot(A))
var/obj/machinery/bot/B = A
switch(dir)
if(SOUTH)
B.x = x-1
if(WEST)
B.y = y+1
if(NORTH)
B.x = x+1
if(EAST)
B.y = y-1
B.turn_on()
B.isolated = 0
B.anchored = 0
passengers[i] = null
occupied_seats = 0
occupied_seats--
sleep(3)
unloading = 0
return
/obj/structure/stool/bed/chair/vehicle/adminbus/proc/freed(var/mob/living/L)
L.buckled = null
L.anchored = 0
L.update_canmove()
L.isolated = 0
L.captured = 0
L.pixel_x = 0
L.pixel_y = 0
L.update_canmove()
/obj/structure/stool/bed/chair/vehicle/adminbus/verb/spawn_clowns()
set name = "Spawn Clowns"
@@ -233,10 +233,14 @@
spawned_mobs.len = 0
/obj/structure/stool/bed/chair/vehicle/adminbus/proc/capture_singulo(var/obj/machinery/singularity/S)
for(var/atom/A in hookshot) //first we remove the hookshot and its chain
qdel(A)
hookshot.len = 0
singulo = S
S.on_capture()
var/obj/structure/singulo_chain/parentchain = null
var/obj/structure/singulo_chain/anchor/A = new /obj/structure/singulo_chain/anchor(loc) //the anchor spawns first, on top of the bus,
var/obj/structure/singulo_chain/anchor/A = new /obj/structure/singulo_chain/anchor(loc) //then we spawn the invisible anchor on top of the bus,
while(get_dist(A,S) > 0) //it then travels toward the singulo while creating chains on its path,
A.forceMove(get_step_towards(A,S)) //and parenting them together
var/obj/structure/singulo_chain/C = new /obj/structure/singulo_chain(A.loc)
@@ -251,8 +255,8 @@
chain_base = A
else
parentchain.child = A
chain += A
A.target = singulo
chain += A //once the anchor has reached the singulo, it parents itself to the last element in the chain
A.target = singulo //and stays on top of the singulo.
/obj/structure/stool/bed/chair/vehicle/adminbus/verb/throw_hookshot()
set name = "Throw Hookshot"
@@ -270,19 +274,16 @@
hook = 0
var/obj/structure/hookshot/claw/C = new/obj/structure/hookshot/claw(get_step(src,src.dir))
var/obj/structure/hookshot/claw/C = new/obj/structure/hookshot/claw(get_step(src,src.dir)) //First we spawn the claw
hookshot += C
C.abus = src
var/obj/machinery/singularity/S = C.launchin(src.dir)
var/obj/machinery/singularity/S = C.launchin(src.dir) //The claw moves forward, spawning hookshot-chains on its path
if(S)
for(var/atom/A in hookshot)
qdel(A)
hookshot.len = 0
capture_singulo(S)
capture_singulo(S) //If the claw hits a singulo, we remove the hookshot-chains and replace them with singulo-chains
else
for(var/obj/structure/hookshot/A in hookshot)
spawn()//so they all return at once
for(var/obj/structure/hookshot/A in hookshot) //If it doesn't hit anything, all the elements of the chain come back toward the bus,
spawn()//so they all return at once //deleting themselves when they reach it.
A.returnin()
/obj/structure/stool/bed/chair/vehicle/adminbus/verb/release_singulo()
@@ -296,32 +297,55 @@
usr << "Nice try."
return
if(singulo)
var/obj/structure/hookshot/claw/A = new /obj/structure/hookshot/claw(loc)
hookshot += A
A.abus = src
A.dropped = 1 //so it doesn't try to grab the singulo again as soon as it drops it.
while(get_dist(A,singulo) > 0)
A.forceMove(get_step_towards(A,singulo))
var/obj/structure/hookshot/H = new /obj/structure/hookshot(A.loc)
hookshot += H
H.abus = src
var/obj/structure/singulo_chain/C = locate(/obj/structure/singulo_chain) in H.loc
if(C)
H.dir = C.dir
for(var/obj/structure/singulo_chain/N in chain)
if(chain_base)
var/obj/structure/singulo_chain/anchor/A = locate(/obj/structure/singulo_chain/anchor) in chain
if(A)
del(A)//so we don't drag the singulo back to us along with the rest of the chain.
if(singulo)
singulo.on_release()
singulo = null
while(chain_base)
var/obj/structure/singulo_chain/C = chain_base
C.move_child(get_turf(src))
chain_base = C.child
del(C)
sleep(2)
for(var/obj/structure/singulo_chain/N in chain)//Just in case some bits of the chain were detached from the bus for whatever reason
del(N)
chain.len = 0
for(var/obj/structure/hookshot/T in hookshot)
spawn()//so they all return at once
T.returnin()
singulo.on_release()
singulo = null
hook = 1
/obj/structure/stool/bed/chair/vehicle/adminbus/verb/mass_rejuvinate()
set name = "Mass Rejuvinate"
set category = "Adminbus"
set src = view(0)
set popup_menu = 0
set hidden = 0
for(var/mob/living/M in orange(src,3))
M.revive()
M << "<span class='notice'>THE ADMINBUS IS LOVE. THE ADMINBUS IS LIFE.</span>"
sleep(2)
/obj/structure/stool/bed/chair/vehicle/adminbus/verb/toggle_lights()
set name = "Toggle Roadlights"
set category = "Adminbus"
set src = view(0)
set popup_menu = 0
set hidden = 0
if(roadlights)
roadlights = 0
overlays -= overlays_bus[2]
else
roadlights = 1
overlays += overlays_bus[2]
/*WIP
/obj/item/key/teleportback
/obj/item/key/teleportback/attack_self(mob/user as mob)
user.send_back()
*/

View File

@@ -1,42 +1,44 @@
//called when the tile is cultified
/turf/proc/cultification()
c_animation = new /atom/movable/overlay(src)
c_animation.name = "cultification"
c_animation.density = 0
c_animation.anchored = 1
c_animation.icon = 'icons/effects/effects.dmi'
c_animation.layer = 3
c_animation.master = src
if(density)
c_animation.icon_state = "cultwall"
else
c_animation.icon_state = "cultfloor"
c_animation.pixel_x = 0
c_animation.pixel_y = 0
flick("cultification",c_animation)
spawn(10)
del(c_animation)
if(!c_animation)
c_animation = new /atom/movable/overlay(src)
c_animation.name = "cultification"
c_animation.density = 0
c_animation.anchored = 1
c_animation.icon = 'icons/effects/effects.dmi'
c_animation.layer = 3
c_animation.master = src
if(density)
c_animation.icon_state = "cultwall"
else
c_animation.icon_state = "cultfloor"
c_animation.pixel_x = 0
c_animation.pixel_y = 0
flick("cultification",c_animation)
spawn(10)
del(c_animation)
//called by various cult runes
/turf/proc/invocanimation(var/animation_type)
c_animation = new /atom/movable/overlay(src)
c_animation.name = "invocanimation"
c_animation.density = 0
c_animation.anchored = 1
c_animation.icon = 'icons/effects/effects.dmi'
c_animation.layer = 5
c_animation.master = src
c_animation.icon_state = "[animation_type]"
c_animation.pixel_x = 0
c_animation.pixel_y = 0
flick("invocanimation",c_animation)
spawn(10)
del(c_animation)
if(!c_animation)
c_animation = new /atom/movable/overlay(src)
c_animation.name = "invocanimation"
c_animation.density = 0
c_animation.anchored = 1
c_animation.icon = 'icons/effects/effects.dmi'
c_animation.layer = 5
c_animation.master = src
c_animation.icon_state = "[animation_type]"
c_animation.pixel_x = 0
c_animation.pixel_y = 0
flick("invocanimation",c_animation)
spawn(10)
del(c_animation)
//called whenever a null rod is blocking a spell or rune
/turf/proc/nullding()
playsound(src, 'sound/piano/Ab7.ogg', 50, 1)
spawn()
if(!c_animation)
c_animation = new /atom/movable/overlay(src)
c_animation.name = "nullding"
c_animation.density = 0
@@ -54,7 +56,7 @@
/turf/proc/beamin(var/color)
playsound(src, 'sound/weapons/emitter2.ogg', 50, 1)
spawn()
if(!c_animation)
c_animation = new /atom/movable/overlay(src)
c_animation.name = "beamin"
c_animation.density = 0
@@ -69,3 +71,20 @@
flick(icon_state,c_animation)
spawn(10)
del(c_animation)
/turf/proc/rejuv(var/color)
playsound(src, 'sound/effects/rejuvinate.ogg', 50, 1)
if(!c_animation)
c_animation = new /atom/movable/overlay(src)
c_animation.name = "rejuvinate"
c_animation.density = 0
c_animation.anchored = 1
c_animation.icon = 'icons/effects/64x64.dmi'
c_animation.layer = 5
c_animation.master = src
c_animation.icon_state = "rejuvinate"
c_animation.pixel_x = -16
flick("rejuvinate",c_animation)
spawn(10)
del(c_animation)

View File

@@ -647,6 +647,15 @@ var/global/floorIsLava = 0
var/dat = "<B>The first rule of adminbuse is: you don't talk about the adminbuse.</B><HR>"
if(check_rights(R_FUN,0))
dat += {"
<B>Fourth-Wall Demolition</B><BR>
<BR>
<A href='?src=\ref[src];secretsfun=spawnadminbus'>Spawn an Adminbus</A><BR>
<A href='?src=\ref[src];secretsfun=spawnselfdummy'>Spawn yourself as a Test Dummy</A><BR>
<BR>
"}
if(check_rights(R_ADMIN,0))
dat += {"
<B>Admin Secrets</B><BR>

View File

@@ -2491,8 +2491,26 @@
new /turf/unsimulated/wall/supermatter(get_turf(usr))
SetUniversalState(/datum/universal_state/supermatter_cascade)
message_admins("[key_name_admin(usr)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(usr)]")
if("spawnadminbus")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","AB")
var/obj/structure/stool/bed/chair/vehicle/adminbus/A = new /obj/structure/stool/bed/chair/vehicle/adminbus(get_turf(usr))
A.dir = EAST
message_admins("[key_name_admin(usr)] has spawned an Adminbus. Who gave him the keys?")
if("spawnselfdummy")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","TD")
var/mob/living/carbon/human/dummy/D = new /mob/living/carbon/human/dummy(get_turf(usr))
usr.client.cmd_assume_direct_control(D)
D.name = "Admin"
D.real_name = "Admin"
var/newname = ""
newname = copytext(sanitize(input(D, "Before you step out as an embodied god, what name do you wish for?", "Choose your name.", "Admin") as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = "Admin"
D.name = newname
D.real_name = newname
message_admins("[key_name_admin(usr)] spawned himself as a Test Dummy.")
if(usr)
log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
if (ok)

View File

@@ -61,6 +61,10 @@
///mob/living/carbon/alien/humanoid/bullet_act(var/obj/item/projectile/Proj) taken care of in living
/mob/living/carbon/alien/humanoid/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
if(wear_suit) wear_suit.emp_act(severity)
if(head) head.emp_act(severity)
if(r_store) r_store.emp_act(severity)
@@ -68,6 +72,10 @@
..()
/mob/living/carbon/alien/humanoid/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -103,6 +111,8 @@
updatehealth()
/mob/living/carbon/alien/humanoid/blob_act()
if(isolated)
return
if (stat == 2)
return
var/shielded = 0
@@ -122,6 +132,8 @@
/mob/living/carbon/alien/humanoid/meteorhit(O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message(text("\red [] has been hit by []", src, O), 1)

View File

@@ -68,6 +68,10 @@
/mob/living/carbon/alien/larva/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -103,6 +107,8 @@
/mob/living/carbon/alien/larva/blob_act()
if(isolated)
return
if (stat == 2)
return
var/shielded = 0
@@ -129,6 +135,8 @@
return
/mob/living/carbon/alien/larva/meteorhit(O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message(text("\red [] has been hit by []", src, O), 1)

View File

@@ -34,6 +34,8 @@
/mob/living/carbon/brain/
proc/handle_mutations_and_radiation()
if(isolated)
return
if (radiation)
if (radiation > 100)
@@ -269,6 +271,10 @@
/*/mob/living/carbon/brain/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
if(!(container && istype(container, /obj/item/device/mmi)))
return
else

View File

@@ -197,6 +197,10 @@
stat("Spacepod Integrity", "[!S.health ? "0" : "[(S.health / initial(S.health)) * 100]"]%")
/mob/living/carbon/human/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -280,6 +284,8 @@
/mob/living/carbon/human/blob_act()
if(isolated)
return
if(stat == DEAD)
return
@@ -290,6 +296,8 @@
return
/mob/living/carbon/human/meteorhit(O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [src] has been hit by [O]", 1)

View File

@@ -131,6 +131,10 @@ emp_act
return 0
/mob/living/carbon/human/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
for(var/obj/O in src)
if(!O) continue
O.emp_act(severity)
@@ -273,6 +277,10 @@ emp_act
update_inv_w_uniform(0)
/mob/living/carbon/human/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -366,6 +374,8 @@ emp_act
/mob/living/carbon/human/blob_act()
if(isolated)
return
if(stat == 2) return
show_message("\red The blob attacks you!")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
@@ -374,6 +384,8 @@ emp_act
return
/mob/living/carbon/human/meteorhit(O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [src] has been hit by [O]", 1)

View File

@@ -441,6 +441,8 @@ var/global/list/organ_damage_overlays = list(
adjustCloneLoss(0.1)
proc/handle_mutations_and_radiation()
if(isolated)
return
if(getFireLoss())
if((M_RESIST_HEAT in mutations) || (prob(1)))
heal_organ_damage(0,1)
@@ -509,6 +511,8 @@ var/global/list/organ_damage_overlays = list(
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
proc/breathe()
if(isolated)
return
if(reagents.has_reagent("lexorin")) return
if(M_NO_BREATH in mutations) return // No breath mutation means no breathing.
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return

View File

@@ -211,10 +211,18 @@
/mob/living/carbon/slime/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
powerlevel = 0 // oh no, the power!
..()
/mob/living/carbon/slime/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if (stat == 2 && client)
return
@@ -246,6 +254,8 @@
/mob/living/carbon/slime/blob_act()
if(isolated)
return
if (stat == 2)
return
var/shielded = 0
@@ -275,6 +285,8 @@
return
/mob/living/carbon/slime/meteorhit(O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message(text("\red [] has been hit by []", src, O), 1)

View File

@@ -112,6 +112,8 @@
stuttering = max(10, stuttering)
proc/handle_mutations_and_radiation()
if(isolated)
return
if(getFireLoss())
if((M_RESIST_HEAT in mutations) || prob(50))
@@ -221,8 +223,10 @@
return
proc/breathe()
if(reagents)
if(isolated)
return
if(reagents)
if(reagents.has_reagent("lexorin")) return
if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite

View File

@@ -307,6 +307,8 @@
return
/mob/living/carbon/monkey/meteorhit(obj/O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
if (health > 0)
@@ -599,10 +601,18 @@
/mob/living/carbon/monkey/var/temperature_resistance = T0C+75
/mob/living/carbon/monkey/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
if(wear_id) wear_id.emp_act(severity)
..()
/mob/living/carbon/monkey/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -626,6 +636,8 @@
return
/mob/living/carbon/monkey/blob_act()
if(isolated)
return
if (stat != 2)
adjustFireLoss(60)
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()

View File

@@ -273,6 +273,10 @@
// now with silicons
/mob/living/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
var/list/L = src.get_contents()
for(var/obj/O in L)
O.emp_act(severity)
@@ -296,6 +300,7 @@
// damage ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/take_organ_damage(var/brute, var/burn)
if(status_flags & GODMODE) return 0 //godmode
if(isolated) return 0
adjustBruteLoss(brute)
adjustFireLoss(burn)
src.updatehealth()
@@ -309,6 +314,7 @@
// damage MANY external organs, in random order
/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null)
if(status_flags & GODMODE) return 0 //godmode
if(isolated) return 0
adjustBruteLoss(brute)
adjustFireLoss(burn)
src.updatehealth()
@@ -320,7 +326,9 @@
/mob/living/proc/revive()
rejuvenate()
/*
buckled = initial(src.buckled)
*/
if(iscarbon(src))
var/mob/living/carbon/C = src
@@ -336,6 +344,9 @@
/mob/living/proc/rejuvenate()
var/turf/T = get_turf(src)
T.rejuv()
// shut down various types of badness
setToxLoss(0)
setOxyLoss(0)
@@ -361,9 +372,11 @@
heal_overall_damage(1000, 1000)
ExtinguishMob()
fire_stacks = 0
/*
if(buckled)
buckled.unbuckle()
buckled = initial(src.buckled)
*/
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
H.timeofdeath = 0

View File

@@ -284,6 +284,8 @@ var/list/ai_list = list()
return 1
/mob/living/silicon/ai/blob_act()
if(isolated)
return
if (stat != 2)
adjustBruteLoss(60)
updatehealth()
@@ -294,6 +296,10 @@ var/list/ai_list = list()
return 0
/mob/living/silicon/ai/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
if (prob(30))
switch(pick(1,2))
if(1)
@@ -303,6 +309,10 @@ var/list/ai_list = list()
..()
/mob/living/silicon/ai/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -399,6 +409,8 @@ var/list/ai_list = list()
return
/mob/living/silicon/ai/meteorhit(obj/O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
//Foreach goto(19)

View File

@@ -101,6 +101,8 @@
return 1
/mob/living/silicon/pai/blob_act()
if(isolated)
return
if (src.stat != 2)
src.adjustBruteLoss(60)
src.updatehealth()
@@ -111,6 +113,10 @@
return 0
/mob/living/silicon/pai/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
// Silence for 2 minutes
// 20% chance to kill
// 33% chance to unbind
@@ -142,6 +148,10 @@
src << "<font color=green>You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.</font>"
/mob/living/silicon/pai/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", src.flash)
@@ -164,6 +174,8 @@
// See software.dm for Topic()
/mob/living/silicon/pai/meteorhit(obj/O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
if (src.health > 0)

View File

@@ -430,6 +430,8 @@
src << "\red You enable [C.name]."
/mob/living/silicon/robot/blob_act()
if(isolated)
return
if (stat != 2)
adjustBruteLoss(60)
updatehealth()
@@ -526,6 +528,10 @@
/mob/living/silicon/robot/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
if(!blinded)
flick("flash", flash)
@@ -548,6 +554,8 @@
/mob/living/silicon/robot/meteorhit(obj/O as obj)
if(isolated)
return
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [src] has been hit by [O]"), 1)
//Foreach goto(19)

View File

@@ -103,6 +103,10 @@
return
/mob/living/silicon/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
switch(severity)
if(1)
src.take_organ_damage(20)

View File

@@ -47,12 +47,14 @@
GiveTarget(new_target)
if(HOSTILE_STANCE_ATTACK)
MoveToTarget()
DestroySurroundings()
if(!isolated)
MoveToTarget()
DestroySurroundings()
if(HOSTILE_STANCE_ATTACKING)
AttackTarget()
DestroySurroundings()
if(!isolated)
AttackTarget()
DestroySurroundings()
if(ranged)
ranged_cooldown--

View File

@@ -99,6 +99,10 @@
return
/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
switch(severity)
if(1.0)
gib()

View File

@@ -152,6 +152,10 @@
//ion rifle!
/mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity)
if(isolated)
src << "The bus' robustness protects you from the EMP."
return
health -= rand(3,15) * (severity + 1)
disabled = rand(150, 600)
hostile_drone = 0

View File

@@ -114,7 +114,7 @@
purge -= 1
//Movement
if((!client||deny_client_move) && !stop_automated_movement && wander && !anchored && (ckey == null))
if((!client||deny_client_move) && !stop_automated_movement && wander && !anchored && (ckey == null) && !isolated)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
@@ -480,6 +480,10 @@
Die()
/mob/living/simple_animal/ex_act(severity)
if(isolated)
src << "The bus' robustness protects you from the explosion."
return
..()
switch (severity)
if (1.0)

View File

@@ -122,6 +122,11 @@
return
/mob/proc/see_narsie(var/obj/machinery/singularity/narsie/large/N)
if(N.bus_captured)
if(narsimage)
del(narsimage)
del(narglow)
return
if((N.z == src.z)&&(get_dist(N,src) <= (N.consume_range+10)))
if(!narsimage)
narsimage = image('icons/obj/narsie.dmi',src.loc,"narsie",9,1)

View File

@@ -4,9 +4,9 @@ var/global/narsie_behaviour = "CultStation13"
name = "Nar-Sie"
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
icon = 'icons/obj/narsie.dmi'
icon_state = "narsie"
pixel_x = -89
pixel_y = -85
icon_state = "narsie-small"
pixel_x = -236
pixel_y = -256
current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO.
contained = 0 // Are we going to move around?
@@ -69,6 +69,8 @@ var/global/narsie_behaviour = "CultStation13"
/obj/machinery/singularity/narsie/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(M.stat == CONSCIOUS)
if(M.isolated)
continue
if(!iscultist(M))
M << "<span class='danger'> You feel your sanity crumble away in an instant as you gaze upon [src.name]...</span>"
M.apply_effect(3, STUN)
@@ -96,6 +98,24 @@ var/global/narsie_behaviour = "CultStation13"
var/movement_dir = pick(alldirs - last_failed_movement)
if(force_move)
movement_dir = force_move
if(target && prob(60))
movement_dir = get_dir(src,target)
spawn(0)
step(src, movement_dir)
spawn(1)
step(src, movement_dir)
return 1
/obj/machinery/singularity/narsie/large/move(var/force_move = 0)
if(!move_self)
return 0
var/movement_dir = pick(alldirs - last_failed_movement)
if(force_move)
movement_dir = force_move
@@ -131,7 +151,7 @@ var/global/narsie_behaviour = "CultStation13"
T.density = 0
luminosity = 1
/obj/machinery/singularity/narsie/consume(const/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
/obj/machinery/singularity/narsie/large/consume(const/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
//NEW BEHAVIOUR
if(narsie_behaviour == "CultStation13")
//MOB PROCESSING
@@ -213,6 +233,49 @@ var/global/narsie_behaviour = "CultStation13"
var/turf/T2 = A
T2.ChangeTurf(/turf/space)
/obj/machinery/singularity/narsie/consume(const/atom/A) //This one is for the small ones.
if (is_type_in_list(A, uneatable))
return 0
if (istype(A, /mob/living/))
var/mob/living/C2 = A
if(C2.isolated)
return 0
C2.dust() // Changed from gib(), just for less lag.
else if (istype(A, /obj/))
A.ex_act(1)
if (A)
qdel(A)
else if (isturf(A))
var/dist = get_dist(A, src)
for (var/atom/movable/AM2 in A.contents)
if (AM2 == src) // This is the snowflake.
continue
if (dist <= consume_range)
consume(AM2)
continue
if (dist > consume_range && canPull(AM2))
if (is_type_in_list(AM2, uneatable))
continue
if (101 == AM2.invisibility)
continue
spawn (0)
step_towards(AM2, src)
if (dist <= consume_range && !istype(A, /turf/space))
var/turf/T2 = A
T2.ChangeTurf(/turf/space)
/obj/machinery/singularity/narsie/ex_act(severity) //No throwing bombs at it either. --NEO
return
@@ -265,6 +328,31 @@ var/global/narsie_behaviour = "CultStation13"
else
target << "<span class='danger'>[capname] HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL.</span>"
/obj/machinery/singularity/narsie/on_capture()
bus_captured = 1
move_self = 0
icon_state ="narsie-small-chains"
/obj/machinery/singularity/narsie/on_release()
bus_captured = 0
move_self = 1
icon_state ="narsie-small"
/obj/machinery/singularity/narsie/large/on_capture()
bus_captured = 1
move_self = 0
icon_state ="narsie-chains"
for(var/mob/M in mob_list)//removing the client image of nar-sie while it is chained
if(M.client)
M.see_narsie(src)
/obj/machinery/singularity/narsie/large/on_release()
bus_captured = 0
move_self = 1
icon_state ="narsie"
/obj/machinery/singularity/narsie/cultify()
return
/*
////////////////Glow//////////////////
/obj/machinery/singularity/narsie/proc/updateicon()
@@ -328,6 +416,8 @@ var/global/mr_clean_targets = list(
/obj/machinery/singularity/narsie/large/clean/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(M.stat == CONSCIOUS)
if(M.isolated)
continue
M << "<span class='warning'> You take a moment to admire [src.name] hard at work...</span>"
M.apply_effect(3, STUN)
@@ -392,4 +482,30 @@ var/global/mr_clean_targets = list(
targets += E
if(targets.len)
acquire(pick(targets))
return
return
/obj/machinery/singularity/narsie/large/clean/move(var/force_move = 0)
if(!move_self)
return 0
var/movement_dir = pick(alldirs - last_failed_movement)
if(force_move)
movement_dir = force_move
if(target && prob(60))
movement_dir = get_dir(src,target)
spawn(0)
step(src, movement_dir)
spawn(1)
step(src, movement_dir)
return 1
/obj/machinery/singularity/narsie/large/clean/on_capture()
bus_captured = 1
move_self = 0
/obj/machinery/singularity/narsie/large/clean/on_release()
bus_captured = 0
move_self = 1

View File

@@ -39,7 +39,7 @@ var/global/list/uneatable = list(
var/last_failed_movement = 0 // Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing.
var/last_warning
var/obj/structure/singulo_chain/anchor/captured = null//Adminbus chain-grab
var/bus_captured = 0//Adminbus chain-grab
/obj/machinery/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
// CARN: admin-alert for chuckle-fuckery.
@@ -139,7 +139,7 @@ var/global/list/uneatable = list(
dissipate_track = 0
dissipate_strength = 1
overlays = 0
if(captured)
if(bus_captured)
overlays += image('icons/obj/singularity.dmi',"chain_s1")
if (3) // 1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them.
current_size = 3
@@ -153,7 +153,7 @@ var/global/list/uneatable = list(
dissipate_track = 0
dissipate_strength = 5
overlays = 0
if(captured)
if(bus_captured)
overlays += image('icons/effects/96x96.dmi',"chain_s3")
if (5)
if ((check_turfs_in(1, 2)) && (check_turfs_in(2, 2)) && (check_turfs_in(4, 2)) && (check_turfs_in(8, 2)))
@@ -168,7 +168,7 @@ var/global/list/uneatable = list(
dissipate_track = 0
dissipate_strength = 20
overlays = 0
if(captured)
if(bus_captured)
overlays += image('icons/effects/160x160.dmi',"chain_s5")
if(7)
if ((check_turfs_in(1, 3)) && (check_turfs_in(2, 3)) && (check_turfs_in(4, 3)) && (check_turfs_in(8, 3)))
@@ -183,7 +183,7 @@ var/global/list/uneatable = list(
dissipate_track = 0
dissipate_strength = 10
overlays = 0
if(captured)
if(bus_captured)
overlays += image('icons/effects/224x224.dmi',"chain_s7")
if(9) // This one also lacks a check for gens because it eats everything.
current_size = 9
@@ -195,7 +195,7 @@ var/global/list/uneatable = list(
consume_range = 4
dissipate = 0 // It cant go smaller due to e loss.
overlays = 0
if(captured)
if(bus_captured)
overlays += image('icons/effects/288x288.dmi',"chain_s9")
if (current_size == allowed_size)
@@ -293,6 +293,11 @@ var/global/list/uneatable = list(
explosion(get_turf(src), dist, dist * 2, dist * 4)
return
if (isbot(A))
var/obj/machinery/bot/B = A
if(B.isolated)
return
A.ex_act(1)
if (A)
@@ -462,7 +467,8 @@ var/global/list/uneatable = list(
for(var/mob/living/carbon/M in oviewers(8, src))
if(istype(M, /mob/living/carbon/brain)) //Ignore brains
continue
if(M.isolated)
continue
if(M.stat == CONSCIOUS)
if (istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
@@ -483,6 +489,7 @@ var/global/list/uneatable = list(
R.receive_pulse(energy)
/obj/machinery/singularity/proc/on_capture()
bus_captured = 1
overlays = 0
move_self = 0
switch (current_size)
@@ -498,5 +505,11 @@ var/global/list/uneatable = list(
overlays += image('icons/effects/288x288.dmi',"chain_s9")
/obj/machinery/singularity/proc/on_release()
bus_captured = 0
overlays = 0
move_self = 1
move_self = 1
/obj/machinery/singularity/cultify()
var/dist = max((current_size - 2), 1)
explosion(get_turf(src), dist, dist * 2, dist * 4)
del(src)

BIN
icons/effects/64x64.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 827 KiB

Binary file not shown.

BIN
sound/misc/adminbus.ogg Normal file

Binary file not shown.