null rod buffs part 2

This commit is contained in:
DeityLink
2014-11-03 04:14:08 +01:00
parent c268089596
commit ed02be9f0d
29 changed files with 571 additions and 211 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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")

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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")

View File

@@ -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

View File

@@ -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())

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

BIN
icons/mob/screen1_ghost.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB