null rod buffs part 2
@@ -88,6 +88,7 @@
|
||||
#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator.
|
||||
|
||||
#define ui_construct_health "15:00,7:15" //same height as humans, hugging the right border
|
||||
#define ui_construct_purge "15:00,6:15"
|
||||
#define ui_construct_fire "14:16,8:13" //above health, slightly to the left
|
||||
#define ui_construct_pull "14:28,2:10" //above the zone_sel icon
|
||||
|
||||
|
||||
@@ -199,6 +199,8 @@ datum/hud/New(mob/owner)
|
||||
shade_hud()
|
||||
else if(isconstruct(mymob))
|
||||
construct_hud()
|
||||
else if(isobserver(mymob))
|
||||
ghost_hud()
|
||||
|
||||
|
||||
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
|
||||
|
||||
@@ -3,7 +3,15 @@
|
||||
return
|
||||
|
||||
/datum/hud/proc/ghost_hud()
|
||||
return
|
||||
mymob.visible = new /obj/screen()
|
||||
mymob.visible.icon = 'icons/mob/screen1_ghost.dmi'
|
||||
mymob.visible.icon_state = "visible0"
|
||||
mymob.visible.name = "visible"
|
||||
mymob.visible.screen_loc = ui_health
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
mymob.client.screen += list(mymob.visible)
|
||||
|
||||
/datum/hud/proc/corgi_hud(u)
|
||||
mymob.fire = new /obj/screen()
|
||||
@@ -80,6 +88,12 @@
|
||||
mymob.pullin.name = "pull"
|
||||
mymob.pullin.screen_loc = ui_construct_pull
|
||||
|
||||
mymob.purged = new /obj/screen()
|
||||
mymob.purged.icon = 'icons/mob/screen1_shade.dmi'
|
||||
mymob.purged.icon_state = "purge0"
|
||||
mymob.purged.name = "purged"
|
||||
mymob.purged.screen_loc = ui_construct_purge
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel()
|
||||
mymob.zone_sel.icon = 'icons/mob/screen1_shade.dmi'
|
||||
mymob.zone_sel.overlays.Cut()
|
||||
@@ -87,7 +101,7 @@
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
mymob.client.screen += list(mymob.healths, mymob.pullin, mymob.zone_sel)
|
||||
mymob.client.screen += list(mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged)
|
||||
|
||||
/datum/hud/proc/construct_hud()
|
||||
var/constructtype
|
||||
@@ -125,9 +139,15 @@
|
||||
mymob.zone_sel.overlays.Cut()
|
||||
mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]")
|
||||
|
||||
mymob.purged = new /obj/screen()
|
||||
mymob.purged.icon = 'icons/mob/screen1_construct.dmi'
|
||||
mymob.purged.icon_state = "purge0"
|
||||
mymob.purged.name = "purged"
|
||||
mymob.purged.screen_loc = ui_construct_purge
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel)
|
||||
mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged)
|
||||
|
||||
switch(constructtype)
|
||||
if("artificer")
|
||||
|
||||
@@ -13,7 +13,11 @@
|
||||
|
||||
// Otherwise jump
|
||||
else
|
||||
loc = get_turf(A)
|
||||
var/turf/targetloc = get_turf(A)
|
||||
if(targetloc.holy && ((src.invisibility == 0) || (src.mind in ticker.mode.cult)))
|
||||
usr << "<span class='warning'>These are sacred grounds, you cannot go there!</span>"
|
||||
else
|
||||
loc = targetloc
|
||||
|
||||
/mob/dead/observer/ClickOn(var/atom/A, var/params)
|
||||
if(client.buildmode)
|
||||
|
||||
@@ -57,9 +57,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
return 0
|
||||
|
||||
if(istype(usr, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/S = src
|
||||
if(S.purge)
|
||||
C << "<span class='warning'>The nullrod's power interferes with your own!</span>"
|
||||
var/mob/living/simple_animal/SA = usr
|
||||
if(SA.purge)
|
||||
SA << "<span class='warning'>The nullrod's power interferes with your own!</span>"
|
||||
return 0
|
||||
|
||||
if(!skipcharge)
|
||||
|
||||
@@ -174,6 +174,16 @@
|
||||
proj_lifespan = 10
|
||||
max_targets = 6
|
||||
|
||||
/mob/living/simple_animal/construct/proc/findNullRod(var/atom/target)
|
||||
if(istype(target,/obj/item/weapon/nullrod))
|
||||
var/turf/T = get_turf(target)
|
||||
nullblock = 1
|
||||
T.nullding()
|
||||
return 1
|
||||
else if(target.contents)
|
||||
for(var/atom/A in target.contents)
|
||||
findNullRod(A)
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/construct/harvester/verb/harvesterharvest()//because harvest is already a proc
|
||||
set name = "Harvest"
|
||||
@@ -184,25 +194,34 @@
|
||||
destination = N.loc
|
||||
break
|
||||
if(destination)
|
||||
var/prey = 0
|
||||
for(var/mob/living/M in src.loc)
|
||||
nullblock = 0
|
||||
if(M != src)//to ensure that the harvester travels last
|
||||
var/obj/item/weapon/nullrod/N = locate() in M
|
||||
if(!N)
|
||||
for(var/turf/T in range(M,1))
|
||||
findNullRod(T)
|
||||
if(!nullblock)
|
||||
M.loc = destination
|
||||
var/atom/movable/overlay/c_animation = new /atom/movable/overlay(src.loc)
|
||||
c_animation.name = "harvesting"
|
||||
c_animation.density = 0
|
||||
c_animation.anchored = 1
|
||||
c_animation.icon = 'icons/effects/effects.dmi'
|
||||
c_animation.layer = 5
|
||||
c_animation.master = src.loc
|
||||
c_animation.icon_state = "rune_teleport"
|
||||
flick("harvesting",c_animation)
|
||||
spawn(10)
|
||||
del(c_animation)
|
||||
src.loc = destination
|
||||
prey = 1
|
||||
if(!nullblock)
|
||||
var/atom/movable/overlay/c_animation = new /atom/movable/overlay(src.loc)
|
||||
c_animation.name = "harvesting"
|
||||
c_animation.density = 0
|
||||
c_animation.anchored = 1
|
||||
c_animation.icon = 'icons/effects/effects.dmi'
|
||||
c_animation.layer = 5
|
||||
c_animation.master = src.loc
|
||||
c_animation.icon_state = "rune_teleport"
|
||||
flick("harvesting",c_animation)
|
||||
spawn(10)
|
||||
del(c_animation)
|
||||
src.loc = destination
|
||||
src << "<span class='warning'>You warp back to Nar-Sie[prey ? " along with your prey":""].</span>"
|
||||
else
|
||||
src << "<span class='warning'>Something is blocking the harvest.</span>"
|
||||
nullblock = 0
|
||||
else
|
||||
src << "<span class='danger'>...something's wrong!</span>"
|
||||
src << "<span class='danger'>...something's wrong!</span>"//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world.
|
||||
|
||||
/mob/living/simple_animal/construct/harvester/verb/harvesterknock()
|
||||
set name = "Disintegrate Doors"
|
||||
|
||||
@@ -24,10 +24,11 @@ In short:
|
||||
*/
|
||||
|
||||
/datum/universal_state/hell/DecayTurf(var/turf/T)
|
||||
T.cultify()
|
||||
for(var/obj/machinery/light/L in T.contents)
|
||||
new /obj/structure/cult/pylon(L.loc)
|
||||
qdel(L)
|
||||
if(!T.holy)
|
||||
T.cultify()
|
||||
for(var/obj/machinery/light/L in T.contents)
|
||||
new /obj/structure/cult/pylon(L.loc)
|
||||
qdel(L)
|
||||
return
|
||||
|
||||
|
||||
@@ -81,7 +82,7 @@ In short:
|
||||
spess.overlays += "hell01"
|
||||
|
||||
for(var/turf/T in world)
|
||||
if(istype(T,/turf/simulated/floor) && prob(1))
|
||||
if(!T.holy && istype(T,/turf/simulated/floor) && prob(1))
|
||||
new /obj/effect/gateway/active/cult(T)
|
||||
|
||||
for (var/obj/machinery/firealarm/alm in world)
|
||||
|
||||
@@ -353,12 +353,13 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
else
|
||||
M.LAssailant = user
|
||||
|
||||
if(istype(M,/mob/dead))
|
||||
M.invisibility = 0
|
||||
user.visible_message( \
|
||||
"<span class='warning'>[user] drags the ghost to our plan of reality!</span>", \
|
||||
"<span class='warning'>You drag the ghost to our plan of reality!</span>" \
|
||||
)
|
||||
if(isobserver(M))
|
||||
if(M.invisibility != 0)
|
||||
M.invisibility = 0
|
||||
user.visible_message( \
|
||||
"<span class='warning'>[user] drags the ghost to our plan of reality!</span>", \
|
||||
"<span class='warning'>You drag the ghost to our plan of reality!</span>" \
|
||||
)
|
||||
return
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
@@ -2,10 +2,22 @@ var/list/sacrificed = list()
|
||||
|
||||
/obj/effect/rune
|
||||
var/atom/movable/overlay/c_animation = null
|
||||
var/nullblock = 0
|
||||
|
||||
/obj/effect/rune/cultify()
|
||||
return
|
||||
|
||||
/obj/effect/rune/proc/findNullRod(var/atom/target)
|
||||
if(istype(target,/obj/item/weapon/nullrod))
|
||||
var/turf/T = get_turf(target)
|
||||
nullblock = 1
|
||||
T.nullding()
|
||||
return 1
|
||||
else if(target.contents)
|
||||
for(var/atom/A in target.contents)
|
||||
findNullRod(A)
|
||||
return 0
|
||||
|
||||
/obj/effect/rune/proc/invocation(var/animation_icon)
|
||||
c_animation = new /atom/movable/overlay(src.loc)
|
||||
c_animation.name = "cultification"
|
||||
@@ -90,6 +102,20 @@ var/list/sacrificed = list()
|
||||
culcount++
|
||||
if(culcount>=3)
|
||||
user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
|
||||
|
||||
nullblock = 0
|
||||
for(var/turf/T1 in range(src,1))
|
||||
findNullRod(T1)
|
||||
if(nullblock)
|
||||
user.visible_message("<span class='warning'>A nearby null rod seems to be blocking the transfer.</span>")
|
||||
return
|
||||
|
||||
for(var/turf/T2 in range(IP,1))
|
||||
findNullRod(T2)
|
||||
if(nullblock)
|
||||
user.visible_message("<span class='warning'>A null rod seems to be blocking the transfer on the other side.</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='warning'>You feel air moving from the rune - like as it was swapped with somewhere else.</span>", \
|
||||
"<span class='warning'>You feel air moving from the rune - like as it was swapped with somewhere else.</span>", \
|
||||
"<span class='warning'>You smell ozone.</span>")
|
||||
@@ -144,8 +170,14 @@ var/list/sacrificed = list()
|
||||
continue
|
||||
if(M.stat==2)
|
||||
continue
|
||||
invocation("rune_convert")
|
||||
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(M,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
usr.visible_message("<span class='warning'>Something is blocking the conversion!</span>")
|
||||
return 0
|
||||
invocation("rune_convert")
|
||||
M.visible_message("<span class='warning'>[M] writhes in pain as the markings below him glow a bloody red.</span>", \
|
||||
"<span class='danger'>AAAAAAHHHH!.</span>", \
|
||||
"<span class='warning'>You hear an anguished scream.</span>")
|
||||
@@ -212,10 +244,14 @@ var/list/sacrificed = list()
|
||||
if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
|
||||
for(var/mob/living/carbon/D in R.loc)
|
||||
if(D.stat!=2)
|
||||
var/bdrain = rand(1,25)
|
||||
D << "<span class='warning'>You feel weakened.</span>"
|
||||
D.take_overall_damage(bdrain, 0)
|
||||
drain += bdrain
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(D,1))
|
||||
findNullRod(T)
|
||||
if(!nullblock)
|
||||
var/bdrain = rand(1,25)
|
||||
D << "<span class='warning'>You feel weakened.</span>"
|
||||
D.take_overall_damage(bdrain, 0)
|
||||
drain += bdrain
|
||||
if(!drain)
|
||||
return fizzle()
|
||||
usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
|
||||
@@ -302,8 +338,14 @@ var/list/sacrificed = list()
|
||||
is_sacrifice_target = 1
|
||||
else
|
||||
if(N.stat!= DEAD)
|
||||
body_to_sacrifice = N
|
||||
break find_sacrifice
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(N,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
return fizzle()
|
||||
else
|
||||
body_to_sacrifice = N
|
||||
break find_sacrifice
|
||||
|
||||
if(!body_to_sacrifice)
|
||||
if (is_sacrifice_target)
|
||||
@@ -636,6 +678,12 @@ var/list/sacrificed = list()
|
||||
cultsinrange += C
|
||||
C.say("Barhah hra zar[pick("'","`")]garis!")
|
||||
for(var/mob/H in victims)
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(H,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
usr << "<span class='warning'>The presence of a null rod is perturbing the ritual.</span>"
|
||||
return
|
||||
if (ticker.mode.name == "cult")
|
||||
if(H.mind == ticker.mode:sacrifice_target)
|
||||
if(cultsinrange.len >= 3)
|
||||
@@ -918,85 +966,51 @@ var/list/sacrificed = list()
|
||||
/////////////////////////////////////////TWENTIETH RUNES
|
||||
|
||||
/obj/effect/rune/proc/deafen()
|
||||
if(istype(src,/obj/effect/rune))
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in range(7,src))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
var/obj/item/weapon/nullrod/N = locate() in C
|
||||
if(N)
|
||||
continue
|
||||
C.ear_deaf += 50
|
||||
C.show_message("<span class='warning'>The world around you suddenly becomes quiet.</span>", 3)
|
||||
affected++
|
||||
if(prob(1))
|
||||
C.sdisabilities |= DEAF
|
||||
if(affected)
|
||||
usr.say("Sti[pick("'","`")] kaliedir!")
|
||||
usr << "<span class='warning'>The world becomes quiet as the deafening rune dissipates into fine dust.</span>"
|
||||
del(src)
|
||||
else
|
||||
return fizzle()
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in range(7,src))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(C,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
C.ear_deaf += 50
|
||||
C.show_message("<span class='warning'>The world around you suddenly becomes quiet.</span>", 3)
|
||||
affected++
|
||||
if(prob(1))
|
||||
C.sdisabilities |= DEAF
|
||||
if(affected)
|
||||
usr.say("Sti[pick("'","`")] kaliedir!")
|
||||
usr << "<span class='warning'>The world becomes quiet as the deafening rune dissipates into fine dust.</span>"
|
||||
del(src)
|
||||
else
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in range(7,usr))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
var/obj/item/weapon/nullrod/N = locate() in C
|
||||
if(N)
|
||||
continue
|
||||
C.ear_deaf += 30
|
||||
//talismans is weaker.
|
||||
C.show_message("\<span class='warning'>The world around you suddenly becomes quiet.</span>", 3)
|
||||
affected++
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliedir!")
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, deafening everyone around.</span>"
|
||||
for (var/mob/V in orange(1,src))
|
||||
if(!(iscultist(V)))
|
||||
V.show_message("<span class='warning'>Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..</span>", 3)
|
||||
return
|
||||
return fizzle()
|
||||
|
||||
/obj/effect/rune/proc/blind()
|
||||
if(istype(src,/obj/effect/rune))
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in viewers(src))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
var/obj/item/weapon/nullrod/N = locate() in C
|
||||
if(N)
|
||||
continue
|
||||
C.eye_blurry += 50
|
||||
C.eye_blind += 20
|
||||
if(prob(5))
|
||||
C.disabilities |= NEARSIGHTED
|
||||
if(prob(10))
|
||||
C.sdisabilities |= BLIND
|
||||
C.show_message("<span class='warning'>Suddenly you see red flash that blinds you.</span>", 3)
|
||||
affected++
|
||||
if(affected)
|
||||
usr.say("Sti[pick("'","`")] kaliesin!")
|
||||
usr << "<span class='warning'>The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.</span>"
|
||||
del(src)
|
||||
else
|
||||
return fizzle()
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in viewers(src))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(C,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
C.eye_blurry += 50
|
||||
C.eye_blind += 20
|
||||
if(prob(5))
|
||||
C.disabilities |= NEARSIGHTED
|
||||
if(prob(10))
|
||||
C.sdisabilities |= BLIND
|
||||
C << "<span class='warning'>Suddenly you see red flash that blinds you.</span>"
|
||||
affected++
|
||||
if(affected)
|
||||
usr.say("Sti[pick("'","`")] kaliesin!")
|
||||
usr << "<span class='warning'>The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.</span>"
|
||||
del(src)
|
||||
else
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in view(2,usr))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
var/obj/item/weapon/nullrod/N = locate() in C
|
||||
if(N)
|
||||
continue
|
||||
C.eye_blurry += 30
|
||||
C.eye_blind += 10
|
||||
//talismans is weaker.
|
||||
affected++
|
||||
C.show_message("<span class='warning'>You feel a sharp pain in your eyes, and the world disappears into darkness..</span>", 3)
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliesin!")
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.</span>"
|
||||
return
|
||||
return fizzle()
|
||||
|
||||
|
||||
/obj/effect/rune/proc/bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy.
|
||||
@@ -1015,8 +1029,10 @@ var/list/sacrificed = list()
|
||||
for(var/mob/living/carbon/M in viewers(usr))
|
||||
if(iscultist(M))
|
||||
continue
|
||||
var/obj/item/weapon/nullrod/N = locate() in M
|
||||
if(N)
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(M,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
M.take_overall_damage(51,51)
|
||||
M << "<span class='warning'>Your blood boils!</span>"
|
||||
@@ -1065,11 +1081,14 @@ var/list/sacrificed = list()
|
||||
|
||||
////////// Rune 24 (counting burningblood, which kinda doesnt work yet.)
|
||||
|
||||
/obj/effect/rune/proc/runestun(var/mob/living/T as mob)
|
||||
if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
|
||||
usr.say("Fuu ma[pick("'","`")]jin!")
|
||||
for(var/mob/living/L in viewers(src))
|
||||
/obj/effect/rune/proc/runestun(var/mob/living/T as mob)///When invoked as rune, flash and stun everyone around.
|
||||
usr.say("Fuu ma[pick("'","`")]jin!")
|
||||
for(var/mob/living/L in viewers(src))
|
||||
|
||||
nullblock = 0
|
||||
for(var/turf/TU in range(L,1))
|
||||
findNullRod(TU)
|
||||
if(!nullblock)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
flick("e_flash", C.flash)
|
||||
@@ -1077,34 +1096,14 @@ var/list/sacrificed = list()
|
||||
C.stuttering = 1
|
||||
C.Weaken(1)
|
||||
C.Stun(1)
|
||||
C.show_message("<span class='warning'>The rune explodes in a bright flash.</span>", 3)
|
||||
C.visible_message("<span class='warning'>The rune explodes in a bright flash.</span>")
|
||||
|
||||
else if(issilicon(L))
|
||||
var/mob/living/silicon/S = L
|
||||
S.Weaken(5)
|
||||
S.show_message("<span class='warning'>BZZZT... The rune has exploded in a bright flash.</span>", 3)
|
||||
del(src)
|
||||
else ///When invoked as talisman, stun and mute the target mob.
|
||||
usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
|
||||
var/obj/item/weapon/nullrod/N = locate() in T
|
||||
if(N)
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message(text("<span class='warning'><B>[] invokes a talisman at [], but they are unaffected!</B></span>", usr, T), 1)
|
||||
else
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message(text("<span class='warning'><B>[] invokes a talisman at []</B></span>", usr, T), 1)
|
||||
|
||||
if(issilicon(T))
|
||||
T.Weaken(15)
|
||||
|
||||
else if(iscarbon(T))
|
||||
var/mob/living/carbon/C = T
|
||||
flick("e_flash", C.flash)
|
||||
if (!(M_HULK in C.mutations))
|
||||
C.silent += 15
|
||||
C.Weaken(25)
|
||||
C.Stun(25)
|
||||
return
|
||||
S.visible_message("<span class='warning'>BZZZT... The rune has exploded in a bright flash.</span>")
|
||||
del(src)
|
||||
return
|
||||
|
||||
/////////////////////////////////////////TWENTY-FIFTH RUNE
|
||||
|
||||
|
||||
@@ -2,6 +2,18 @@
|
||||
icon_state = "paper_talisman"
|
||||
var/imbue = null
|
||||
var/uses = 0
|
||||
var/nullblock = 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/findNullRod(var/atom/target)
|
||||
if(istype(target,/obj/item/weapon/nullrod))
|
||||
var/turf/T = get_turf(target)
|
||||
nullblock = 1
|
||||
T.nullding()
|
||||
return 1
|
||||
else if(target.contents)
|
||||
for(var/atom/A in target.contents)
|
||||
findNullRod(A)
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/examine()
|
||||
@@ -39,9 +51,11 @@
|
||||
//If the user cancels the talisman this var will be set to 0
|
||||
delete = call(/obj/effect/rune/proc/communicate)()
|
||||
if("deafen")
|
||||
call(/obj/effect/rune/proc/deafen)()
|
||||
deafen()
|
||||
del(src)
|
||||
if("blind")
|
||||
call(/obj/effect/rune/proc/blind)()
|
||||
blind()
|
||||
del(src)
|
||||
if("runestun")
|
||||
user << "\red To use this talisman, attack your target directly."
|
||||
return
|
||||
@@ -61,7 +75,7 @@
|
||||
if(iscultist(user))
|
||||
if(imbue == "runestun")
|
||||
user.take_organ_damage(5, 0)
|
||||
call(/obj/effect/rune/proc/runestun)(T)
|
||||
runestun(T)
|
||||
del(src)
|
||||
else
|
||||
..() ///If its some other talisman, use the generic attack code, is this supposed to work this way?
|
||||
@@ -133,4 +147,69 @@
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
imbue = "supply"
|
||||
uses = 5
|
||||
uses = 5
|
||||
|
||||
|
||||
//imbued talismans invocation for a few runes, since calling the proc causes a runtime error due to src = null
|
||||
/obj/item/weapon/paper/talisman/proc/runestun(var/mob/living/T as mob)//When invoked as talisman, stun and mute the target mob.
|
||||
usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
|
||||
nullblock = 0
|
||||
for(var/turf/TU in range(T,1))
|
||||
findNullRod(TU)
|
||||
if(nullblock)
|
||||
usr.visible_message("<span class='danger'>[usr] invokes a talisman at [T], but they are unaffected!</span>")
|
||||
else
|
||||
usr.visible_message("<span class='danger'>[usr] invokes a talisman at [T]</span>")
|
||||
|
||||
if(issilicon(T))
|
||||
T.Weaken(15)
|
||||
|
||||
else if(iscarbon(T))
|
||||
var/mob/living/carbon/C = T
|
||||
flick("e_flash", C.flash)
|
||||
if (!(M_HULK in C.mutations))
|
||||
C.silent += 15
|
||||
C.Weaken(25)
|
||||
C.Stun(25)
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/blind()
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in view(2,usr))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(C,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
C.eye_blurry += 30
|
||||
C.eye_blind += 10
|
||||
//talismans is weaker.
|
||||
affected++
|
||||
C << "<span class='warning'>You feel a sharp pain in your eyes, and the world disappears into darkness..</span>"
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliesin!")
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.</span>"
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/deafen()
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in range(7,usr))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(C,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
C.ear_deaf += 30
|
||||
//talismans is weaker.
|
||||
C.show_message("\<span class='warning'>The world around you suddenly becomes quiet.</span>", 3)
|
||||
affected++
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliedir!")
|
||||
usr << "<span class='warning'>Your talisman turns into gray dust, deafening everyone around.</span>"
|
||||
for (var/mob/V in orange(1,src))
|
||||
if(!(iscultist(V)))
|
||||
V.show_message("<span class='warning'>Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..</span>", 3)
|
||||
@@ -11,6 +11,8 @@
|
||||
var/drying = 0 // tracking if something is currently drying
|
||||
/turf/simulated/New()
|
||||
..()
|
||||
if(istype(loc, /area/chapel))
|
||||
holy = 1
|
||||
levelupdate()
|
||||
|
||||
/turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808")
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
// cultification animation
|
||||
var/atom/movable/overlay/c_animation = null
|
||||
|
||||
// holy water
|
||||
var/holy = 0
|
||||
|
||||
/turf/New()
|
||||
..()
|
||||
for(var/atom/movable/AM as mob|obj in src)
|
||||
@@ -417,6 +420,8 @@
|
||||
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)
|
||||
@@ -430,10 +435,29 @@
|
||||
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)
|
||||
|
||||
/turf/proc/nullding()
|
||||
playsound(src, 'sound/piano/Ab7.ogg', 50, 1)
|
||||
spawn()
|
||||
c_animation = new /atom/movable/overlay(src)
|
||||
c_animation.name = "nullding"
|
||||
c_animation.density = 0
|
||||
c_animation.anchored = 1
|
||||
c_animation.icon = 'icons/effects/96x96.dmi'
|
||||
c_animation.layer = 5
|
||||
c_animation.master = src
|
||||
c_animation.icon_state = "nullding"
|
||||
c_animation.pixel_x = -32
|
||||
c_animation.pixel_y = -32
|
||||
flick("nullding",c_animation)
|
||||
spawn(10)
|
||||
del(c_animation)
|
||||
|
||||
/turf/proc/cultify()
|
||||
ChangeTurf(/turf/space)
|
||||
return
|
||||
@@ -31,7 +31,7 @@ var/list/directional = list(
|
||||
/obj/structure/window/full,
|
||||
/obj/structure/stool/bed/chair,
|
||||
/obj/structure/table,
|
||||
/obj/machinery/light
|
||||
/obj/machinery/light,
|
||||
)
|
||||
|
||||
var/list/exception = list(
|
||||
@@ -137,6 +137,9 @@ proc
|
||||
if(C.lying && !isalienadult(C))//because adult aliens have their own resting sprite
|
||||
add.Turn(90)
|
||||
|
||||
if(isobserver(A))
|
||||
add.ChangeOpacity(0.5)
|
||||
|
||||
// Find the new dimensions of the flat icon to fit the added overlay
|
||||
addX1 = min(flatX1, I:pixel_x+1)
|
||||
addX2 = max(flatX2, I:pixel_x+add.Width())
|
||||
|
||||
@@ -45,6 +45,10 @@
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
update_icon()
|
||||
else if(istype(O, /obj/item/weapon/storage/bible))
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
update_icon()
|
||||
else if(istype(O, /obj/item/weapon/wrench))
|
||||
user << "<span class='notice'> Now disassembling bookcase</span>"
|
||||
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
var/atom/movable/following = null
|
||||
incorporeal_move = 1
|
||||
|
||||
|
||||
/mob/dead/observer/New(var/mob/body=null, var/flags=1)
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
@@ -54,14 +53,21 @@
|
||||
|
||||
// NEW SPOOKY BAY GHOST ICONS
|
||||
//////////////
|
||||
|
||||
/*//What's the point of that? The icon and overlay renders without problem even with just the bottom part. I putting the old code in comment. -Deity Link
|
||||
if (ishuman(body))
|
||||
var/mob/living/carbon/human/H = body
|
||||
icon = H.stand_icon
|
||||
overlays = H.overlays_standing
|
||||
overlays = H.overlays_standing//causes issue with sepia cameras
|
||||
else
|
||||
icon = body.icon
|
||||
icon_state = body.icon_state
|
||||
overlays = body.overlays
|
||||
*/
|
||||
|
||||
icon = body.icon
|
||||
icon_state = body.icon_state
|
||||
overlays = body.overlays
|
||||
|
||||
// No icon? Ghost icon time.
|
||||
if(isnull(icon) || isnull(icon_state))
|
||||
@@ -114,6 +120,14 @@
|
||||
"\red You get the feeling that the ghost can't become any more visible." \
|
||||
)
|
||||
|
||||
if(istype(W,/obj/item/weapon/storage/bible) || istype(W,/obj/item/weapon/nullrod))
|
||||
var/mob/dead/M = src
|
||||
if(src.invisibility == 0)
|
||||
M.invisibility = 60
|
||||
user.visible_message( \
|
||||
"<span class='warning'>[user] banishes the ghost from our plan of reality!</span>", \
|
||||
"<span class='warning'>You banish the ghost from our plan of reality!</span>" \
|
||||
)
|
||||
|
||||
/mob/dead/observer/get_multitool(var/active_only=0)
|
||||
return ghostMulti
|
||||
@@ -146,6 +160,11 @@ Works together with spawning an observer, noted above.
|
||||
if(medHUD)
|
||||
process_medHUD(src)
|
||||
|
||||
if(visible)
|
||||
if(invisibility == 0)
|
||||
visible.icon_state = "visible1"
|
||||
else
|
||||
visible.icon_state = "visible0"
|
||||
|
||||
// Direct copied from medical HUD glasses proc, used to determine what health bar to put over the targets head.
|
||||
/mob/dead/proc/RoundHealth(var/health)
|
||||
@@ -417,11 +436,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(!thearea) return
|
||||
|
||||
var/list/L = list()
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
L+=T
|
||||
var/holyblock = 0
|
||||
|
||||
if((usr.invisibility == 0) || (usr.mind in ticker.mode.cult))
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
if(!T.holy)
|
||||
L+=T
|
||||
else
|
||||
holyblock = 1
|
||||
else
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
L+=T
|
||||
|
||||
if(!L || !L.len)
|
||||
usr << "No area available."
|
||||
if(holyblock)
|
||||
usr << "<span class='warning'>This area has been entirely made into sacred grounds, you cannot enter it while you are in this plane of existence!</span>"
|
||||
else
|
||||
usr << "No area available."
|
||||
|
||||
usr.loc = pick(L)
|
||||
|
||||
@@ -437,23 +468,28 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
// This is the ghost's follow verb with an argument
|
||||
/mob/dead/observer/proc/ManualFollow(var/atom/movable/target)
|
||||
if(target && target != src)
|
||||
if(following && following == target)
|
||||
if(target)
|
||||
var/turf/targetloc = get_turf(target)
|
||||
if(targetloc.holy && ((src.invisibility == 0) || (src.mind in ticker.mode.cult)))
|
||||
usr << "<span class='warning'>You cannot follow a mob standing on holy grounds!</span>"
|
||||
return
|
||||
following = target
|
||||
src << "\blue Now following [target]"
|
||||
spawn(0)
|
||||
var/turf/pos = get_turf(src)
|
||||
while(loc == pos && target && following == target && client)
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T)
|
||||
break
|
||||
// To stop the ghost flickering.
|
||||
if(loc != T)
|
||||
loc = T
|
||||
pos = loc
|
||||
sleep(15)
|
||||
following = null
|
||||
if(target != src)
|
||||
if(following && following == target)
|
||||
return
|
||||
following = target
|
||||
src << "<span class='notice'>Now following [target]</span>"
|
||||
spawn(0)
|
||||
var/turf/pos = get_turf(src)
|
||||
while(loc == pos && target && following == target && client)
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T)
|
||||
break
|
||||
// To stop the ghost flickering.
|
||||
if(loc != T)
|
||||
loc = T
|
||||
pos = loc
|
||||
sleep(15)
|
||||
following = null
|
||||
|
||||
|
||||
/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
|
||||
@@ -473,6 +509,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if (!target)//Make sure we actually have a target
|
||||
return
|
||||
else
|
||||
var/turf/targetloc = get_turf(target)
|
||||
if(targetloc.holy && ((src.invisibility == 0) || (src.mind in ticker.mode.cult)))
|
||||
usr << "<span class='warning'>The mob that you are trying to follow is standing on holy grounds, you cannot reach him!</span>"
|
||||
return
|
||||
var/mob/M = dest[target] //Destination mob
|
||||
var/mob/A = src //Source mob
|
||||
var/turf/T = get_turf(M) //Turf of the destination mob
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
minbodytemp = 0
|
||||
faction = "cult"
|
||||
supernatural = 1
|
||||
var/nullblock = 0
|
||||
|
||||
var/list/construct_spells = list()
|
||||
|
||||
/mob/living/simple_animal/construct/cultify()
|
||||
@@ -123,6 +125,9 @@
|
||||
var/damage = O.force
|
||||
if (O.damtype == HALLOSS)
|
||||
damage = 0
|
||||
if(istype(O,/obj/item/weapon/nullrod))
|
||||
damage *= 2
|
||||
purge = 3
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
@@ -133,6 +138,7 @@
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/airflow_stun()
|
||||
return
|
||||
|
||||
@@ -389,6 +395,10 @@
|
||||
if(pulling) pullin.icon_state = "pull1"
|
||||
else pullin.icon_state = "pull0"
|
||||
|
||||
if(purged)
|
||||
if(purge > 0) purged.icon_state = "purge1"
|
||||
else purged.icon_state = "purge0"
|
||||
|
||||
if(construct_spell1)
|
||||
construct_spell1.overlays = 0
|
||||
if(purge)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
faction = "carp"
|
||||
faction = "forest"
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/FindTarget()
|
||||
. = ..()
|
||||
@@ -65,7 +65,6 @@
|
||||
icon_gib = "festivus_pole"
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/festivus/Die()
|
||||
..()
|
||||
visible_message("\red <b>[src]</b> is hacked into pieces!")
|
||||
new /obj/item/weapon/nullrod(loc)
|
||||
del(src)
|
||||
@@ -52,6 +52,9 @@
|
||||
var/damage = O.force
|
||||
if (O.damtype == HALLOSS)
|
||||
damage = 0
|
||||
if(istype(O,/obj/item/weapon/nullrod))
|
||||
damage *= 2
|
||||
purge = 3
|
||||
health -= damage
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
@@ -67,7 +70,14 @@
|
||||
|
||||
/mob/living/simple_animal/shade/Life()
|
||||
. = ..()
|
||||
pullin.icon_state = "pull1"
|
||||
|
||||
if(pullin)
|
||||
pullin.icon_state = "pull1"
|
||||
|
||||
if(purged)
|
||||
if(purge > 0) purged.icon_state = "purge1"
|
||||
else purged.icon_state = "purge0"
|
||||
|
||||
switch(health)
|
||||
if(50 to INFINITY) healths.icon_state = "shade_health0"
|
||||
if(41 to 49) healths.icon_state = "shade_health1"
|
||||
|
||||
@@ -446,6 +446,8 @@
|
||||
tally = speed
|
||||
|
||||
if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. (muh dotuh)
|
||||
if(tally <= 0)
|
||||
tally = 1
|
||||
tally *= purge
|
||||
|
||||
return tally+config.animal_delay
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
var/obj/screen/blind = null
|
||||
var/obj/screen/hands = null
|
||||
var/obj/screen/pullin = null
|
||||
var/obj/screen/visible = null
|
||||
var/obj/screen/purged = null
|
||||
var/obj/screen/internals = null
|
||||
var/obj/screen/oxygen = null
|
||||
var/obj/screen/i_select = null
|
||||
|
||||
@@ -354,9 +354,13 @@
|
||||
var/turf/mobloc = get_turf(mob)
|
||||
|
||||
switch(mob.incorporeal_move)
|
||||
if(1 || isobserver(mob))
|
||||
mob.loc = get_step(mob, direct)
|
||||
mob.dir = direct
|
||||
if(1)
|
||||
var/turf/T = get_step(mob, direct)
|
||||
if(T.holy && isobserver(mob) && ((mob.invisibility == 0) || (mob.mind in ticker.mode.cult)))
|
||||
mob << "<span class='warning'>You cannot get past holy grounds while you are in this plane of existence!</span>"
|
||||
else
|
||||
mob.loc = get_step(mob, direct)
|
||||
mob.dir = direct
|
||||
if(2)
|
||||
if(prob(50))
|
||||
var/locx
|
||||
|
||||
@@ -218,10 +218,11 @@
|
||||
for(var/turf/T in turfs)
|
||||
atoms.Add(T)
|
||||
for(var/atom/movable/A in T)
|
||||
if(A.invisibility)
|
||||
if(!istype(A, /mob/))
|
||||
continue
|
||||
atoms.Add(A)
|
||||
if(A.invisibility != 0)
|
||||
if(istype(A, /mob/))
|
||||
atoms.Add(A)
|
||||
else
|
||||
atoms.Add(A)
|
||||
|
||||
var/list/sorted = list()
|
||||
var/j
|
||||
@@ -277,6 +278,48 @@
|
||||
mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. "
|
||||
else
|
||||
mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
|
||||
for(var/mob/living/simple_animal/S in the_turf)
|
||||
if(S.invisibility != 0) continue
|
||||
if(!mob_detail)
|
||||
mob_detail = "You can see [S] on the photo[S.health < (S.maxHealth/2) ? " - [S] looks hurt":""]."
|
||||
else
|
||||
mob_detail += "You can also see [S] on the photo[S.health < (S.maxHealth/2) ? " - [S] looks hurt":""]."
|
||||
for(var/mob/dead/observer/O in the_turf)//in case ghosts have been made visible
|
||||
if(O.invisibility != 0) continue
|
||||
if(!mob_detail)
|
||||
mob_detail = "Wait...is that [O] on the photo? "
|
||||
else
|
||||
mob_detail += "...wait a minute...isn't that [O] on the photo?"
|
||||
return mob_detail
|
||||
|
||||
|
||||
/obj/item/device/camera/sepia/camera_get_mobs(turf/the_turf)
|
||||
var/mob_detail
|
||||
for(var/mob/living/carbon/A in the_turf)
|
||||
var/holding = null
|
||||
if(A.l_hand || A.r_hand)
|
||||
if(A.l_hand) holding = "They are holding \a [A.l_hand]"
|
||||
if(A.r_hand)
|
||||
if(holding)
|
||||
holding += " and \a [A.r_hand]"
|
||||
else
|
||||
holding = "They are holding \a [A.r_hand]"
|
||||
|
||||
if(!mob_detail)
|
||||
mob_detail = "You can see [A] on the photo[A.health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. "
|
||||
else
|
||||
mob_detail += "You can also see [A] on the photo[A.health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
|
||||
for(var/mob/living/simple_animal/S in the_turf)
|
||||
if(!mob_detail)
|
||||
mob_detail = "You can see [S] on the photo[S.health < (S.maxHealth/2) ? " - [S] looks hurt":""]."
|
||||
else
|
||||
mob_detail += "You can also see [S] on the photo[S.health < (S.maxHealth/2) ? " - [S] looks hurt":""]."
|
||||
for(var/mob/dead/observer/O in the_turf)
|
||||
if(!mob_detail)
|
||||
mob_detail = "Wait...is that [O] on the photo? "
|
||||
else
|
||||
mob_detail += "...wait a minute...isn't that [O] on the photo?"
|
||||
|
||||
return mob_detail
|
||||
|
||||
|
||||
|
||||
@@ -162,6 +162,8 @@ var/global/narsie_behaviour = "CultStation13"
|
||||
|
||||
if (dist <= consume_range && !istype(A, /turf/space))
|
||||
var/turf/T = A
|
||||
if(T.holy)
|
||||
T.holy = 0 //Nar-Sie doesn't give a shit about sacred grounds.
|
||||
T.cultify()
|
||||
|
||||
//OLD BEHAVIOUR
|
||||
|
||||
@@ -682,10 +682,10 @@ datum
|
||||
if(!holder) return
|
||||
if(ishuman(M))
|
||||
if((M.mind in ticker.mode.cult) && prob(10))
|
||||
M << "\blue A cooling sensation from inside you brings you an untold calmness."
|
||||
M << "<span class='notice'>A cooling sensation from inside you brings you an untold calmness.</span>"
|
||||
ticker.mode.remove_cultist(M.mind)
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("\blue []'s eyes blink and become clearer.", M), 1) // So observers know it worked.
|
||||
O.show_message(text("<span class='notice'>[]'s eyes blink and become clearer.</span>", M), 1) // So observers know it worked.
|
||||
// Vamps react to this like acid
|
||||
if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && prob(10))
|
||||
if(!(VAMP_FULL in M.mind.vampire.powers))
|
||||
@@ -702,11 +702,11 @@ datum
|
||||
var/mob/living/carbon/human/H=M
|
||||
if(method == TOUCH)
|
||||
if(H.wear_mask)
|
||||
H << "\red Your mask protects you from the holy water!"
|
||||
H << "<span class='warning'>Your mask protects you from the holy water!</span>"
|
||||
return
|
||||
|
||||
if(H.head)
|
||||
H << "\red Your helmet protects you from the holy water!"
|
||||
H << "<span class='warning'>\red Your helmet protects you from the holy water!</span>"
|
||||
return
|
||||
if(!M.unacidable)
|
||||
if(prob(15) && volume >= 30)
|
||||
@@ -723,6 +723,12 @@ datum
|
||||
M.take_organ_damage(min(15, volume * 2))
|
||||
return
|
||||
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
if(volume >= 5)
|
||||
T.holy = 1
|
||||
return
|
||||
|
||||
serotrotium
|
||||
name = "Serotrotium"
|
||||
id = "serotrotium"
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
if(!is_open_container())
|
||||
user << "<span class='rose'>You can't; [src] is closed.</span>" //Added this here and elsewhere to prevent drinking, etc. from closed drink containers. - Hinaichigo
|
||||
return 0
|
||||
|
||||
|
||||
else if(!src.reagents.total_volume || !src)
|
||||
user << "<span class='rose'>None of [src] left, oh no!<span>"
|
||||
return 0
|
||||
@@ -49,24 +49,24 @@
|
||||
if(user.a_intent == "hurt" && isGlass && molotov != 1) //to smash on someone, must be harm intent, breakable glass, and have no rag inside
|
||||
if(!M)
|
||||
return
|
||||
|
||||
|
||||
force = 15 //Smashing bottles over someoen's head hurts. //todo: check that this isn't overwriting anything it shouldn't be
|
||||
|
||||
|
||||
var/datum/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at
|
||||
|
||||
|
||||
var/armor_block = 0 //Get the target's armour values for normal attack damage.
|
||||
var/armor_duration = 0 //The more force the bottle has, the longer the duration.
|
||||
|
||||
|
||||
//Calculating duration and calculating damage.
|
||||
if(ishuman(M))
|
||||
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/headarmor = 0 // Target's head armour
|
||||
armor_block = H.run_armor_check(affecting, "melee") // For normal attack damage
|
||||
|
||||
|
||||
//If they have a hat/helmet and the user is targeting their head.
|
||||
if(istype(H.head, /obj/item/clothing/head) && affecting == "head")
|
||||
|
||||
|
||||
// If their head has an armour value, assign headarmor to it, else give it 0.
|
||||
if(H.head.armor["melee"])
|
||||
headarmor = H.head.armor["melee"]
|
||||
@@ -74,24 +74,24 @@
|
||||
headarmor = 0
|
||||
else
|
||||
headarmor = 0
|
||||
|
||||
|
||||
//Calculate the weakening duration for the target.
|
||||
armor_duration = (duration - headarmor) + force
|
||||
|
||||
|
||||
else
|
||||
//Only humans can have armour, right?
|
||||
armor_block = M.run_armor_check(affecting, "melee")
|
||||
if(affecting == "head")
|
||||
armor_duration = duration + force
|
||||
armor_duration /= 10
|
||||
|
||||
|
||||
//Apply the damage!
|
||||
M.apply_damage(force, BRUTE, affecting, armor_block)
|
||||
|
||||
|
||||
// You are going to knock someone out for longer if they are not wearing a helmet.
|
||||
// For drinking glass
|
||||
if(affecting == "head" && istype(M, /mob/living/carbon/))
|
||||
|
||||
|
||||
//Display an attack message.
|
||||
for(var/mob/O in viewers(user, null))
|
||||
if(M != user) O.show_message(text("\red <B>[M] has been hit over the head with a [smashtext][src.name], by [user]!</B>"), 1)
|
||||
@@ -99,13 +99,13 @@
|
||||
//Weaken the target for the duration that we calculated and divide it by 5.
|
||||
if(armor_duration)
|
||||
M.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash!
|
||||
|
||||
|
||||
else
|
||||
//Default attack message and don't weaken the target.
|
||||
for(var/mob/O in viewers(user, null))
|
||||
if(M != user) O.show_message(text("\red <B>[M] has been attacked with a [smashtext][src.name], by [user]!</B>"), 1)
|
||||
else O.show_message(text("\red <B>[M] has attacked himself with a [smashtext][src.name]!</B>"), 1)
|
||||
|
||||
|
||||
//Attack logs
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has attacked [M.name] ([M.ckey]) with a bottle!</font>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been smashed with a bottle by [user.name] ([user.ckey])</font>")
|
||||
@@ -114,22 +114,22 @@
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
|
||||
|
||||
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
|
||||
if(src.reagents)
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\blue <B>The contents of \the [smashtext][src] splashes all over [M]!</B>"), 1)
|
||||
src.reagents.reaction(M, TOUCH)
|
||||
|
||||
|
||||
//Finally, smash the bottle. This kills (del) the bottle.
|
||||
src.smash(M, user)
|
||||
|
||||
|
||||
return
|
||||
|
||||
else if(!is_open_container())
|
||||
user << "<span class='rose'>You can't; [src] is closed.</span>" //Added this here and elsewhere to prevent drinking, etc. from closed drink containers. - Hinaichigo
|
||||
return 0
|
||||
|
||||
|
||||
else if(!R.total_volume || !R)
|
||||
user << "<span class='rose'>None of [src] left, oh no!<span>"
|
||||
return 0
|
||||
@@ -243,7 +243,7 @@
|
||||
usr << "<span class='notice'>\The [src] is almost full!</span>"
|
||||
else
|
||||
usr << "<span class='notice'>\The [src] is full!</span>"
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/proc/imbibe(mob/user) //drink the liquid within
|
||||
user << "<span class='notice'>You swallow a gulp of [src].</span>"
|
||||
if(reagents.total_volume)
|
||||
@@ -253,7 +253,7 @@
|
||||
|
||||
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/New()
|
||||
..()
|
||||
@@ -837,9 +837,92 @@
|
||||
isGlass = 1
|
||||
smashtext = ""
|
||||
smashname = "broken flask"
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("holywater", 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/New()
|
||||
..()
|
||||
reagents.add_reagent("holywater", 100)
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/attack(mob/living/M as mob, mob/user as mob, def_zone)
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/afterattack(obj/target, mob/user , flag)//copied from glass.dm, only way to have it only dispense 5u of its content
|
||||
..()
|
||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
||||
user << "\blue You splash some the flask's content onto [target]."
|
||||
|
||||
var/mob/living/M = target
|
||||
var/list/injected = list()
|
||||
for(var/datum/reagent/R in src.reagents.reagent_list)
|
||||
injected += R.name
|
||||
var/contained = english_list(injected)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been splashed with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to splash [M.name] ([M.key]). Reagents: [contained]</font>")
|
||||
msg_admin_attack("[user.name] ([user.ckey]) splashed [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message(text("<span class='warning'>[] has been splashed with something by []!</span>", target, user), 1)
|
||||
src.reagents.reaction(target, TOUCH)
|
||||
spawn(5) src.reagents.remove_any(5)
|
||||
return
|
||||
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
|
||||
|
||||
if(!target.reagents.total_volume && target.reagents)
|
||||
user << "<span class='warning'>[target] is empty.</span>"
|
||||
return
|
||||
|
||||
if(reagents.total_volume >= reagents.maximum_volume)
|
||||
user << "<span class='warning'>[src] is full.</span>"
|
||||
return
|
||||
|
||||
var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
|
||||
user << "<span class='notice'>You fill [src] with [trans] units of the contents of [target].</span>"
|
||||
|
||||
else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
|
||||
if(!reagents.total_volume)
|
||||
user << "<span class='warning'>[src] is empty.</span>"
|
||||
return
|
||||
|
||||
if(target.reagents.total_volume >= target.reagents.maximum_volume)
|
||||
user << "<span class='warning'>[target] is full.</span>"
|
||||
return
|
||||
|
||||
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
|
||||
user << "<span class='notice'>You transfer [trans] units of the solution to [target].</span>"
|
||||
|
||||
// /vg/: Logging transfers of bad things
|
||||
if(target.reagents_to_log.len)
|
||||
var/list/badshit=list()
|
||||
for(var/bad_reagent in target.reagents_to_log)
|
||||
if(reagents.has_reagent(bad_reagent))
|
||||
badshit += reagents_to_log[bad_reagent]
|
||||
if(badshit.len)
|
||||
var/hl="\red <b>([english_list(badshit)])</b> \black"
|
||||
message_admins("[user.name] ([user.ckey]) added [trans]U to \a [target] with [src].[hl] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
log_game("[user.name] ([user.ckey]) added [trans]U to \a [target] with [src].")
|
||||
|
||||
//Safety for dumping stuff into a ninja suit. It handles everything through attackby() and this is unnecessary.
|
||||
else if(istype(target, /obj/item/clothing/suit/space/space_ninja))
|
||||
return
|
||||
|
||||
else if(istype(target, /obj/machinery/bunsen_burner))
|
||||
return
|
||||
|
||||
else if(istype(target, /obj/machinery/anomaly))
|
||||
return
|
||||
|
||||
else if(reagents.total_volume)
|
||||
user << "<span class='notice'>You splash some the flask's content onto [target].</span>"
|
||||
if(reagents.has_reagent("fuel"))
|
||||
message_admins("[user.name] ([user.ckey]) poured Welder Fuel onto [target]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
log_game("[user.name] ([user.ckey]) poured Welder Fuel onto [target]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
src.reagents.reaction(target, TOUCH)
|
||||
spawn(5) src.reagents.remove_any(5)
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth
|
||||
name = "Goldeneye Vermouth"
|
||||
@@ -979,7 +1062,7 @@
|
||||
playsound(src, "shatter", 70, 1)
|
||||
|
||||
del(src)
|
||||
|
||||
|
||||
//smashing when thrown
|
||||
/obj/item/weapon/reagent_containers/food/drinks/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
@@ -1001,7 +1084,7 @@
|
||||
loca.hotspot_expose(700, 1000,surfaces=istype(loc,/turf))
|
||||
else
|
||||
new /obj/item/weapon/reagent_containers/glass/rag(get_turf(src))
|
||||
|
||||
|
||||
|
||||
//create new broken bottle
|
||||
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(loc)
|
||||
|
||||
|
Before Width: | Height: | Size: 326 KiB After Width: | Height: | Size: 358 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
BIN
icons/mob/screen1_ghost.dmi
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |