Fixed the signpost shuttle bug.
Critters have been added and livestock removed Xbow damage raised to 30 a shot Centcom Survival Kit is once again a box Sec uniforms moved into their own locker After IRC talk Guns that are created in the protolathe now spawn inside of a lockbox They can be unlocked by an ID with Armory access or an Emag. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2045 316c924e-a436-60f5-8080-3fe189b3f50e
@@ -6,7 +6,7 @@
|
||||
log_admin("[key_name(usr)] has left build mode.")
|
||||
M.client.buildmode = 0
|
||||
M.client.show_popup_menus = 1
|
||||
for(var/obj/buildholder/H)
|
||||
for(var/obj/bmode/buildholder/H)
|
||||
if(H.cl == M.client)
|
||||
del(H)
|
||||
else
|
||||
@@ -14,14 +14,14 @@
|
||||
M.client.buildmode = 1
|
||||
M.client.show_popup_menus = 0
|
||||
|
||||
var/obj/buildholder/H = new/obj/buildholder()
|
||||
var/obj/builddir/A = new/obj/builddir(H)
|
||||
var/obj/bmode/buildholder/H = new/obj/bmode/buildholder()
|
||||
var/obj/bmode/builddir/A = new/obj/bmode/builddir(H)
|
||||
A.master = H
|
||||
var/obj/buildhelp/B = new/obj/buildhelp(H)
|
||||
var/obj/bmode/buildhelp/B = new/obj/bmode/buildhelp(H)
|
||||
B.master = H
|
||||
var/obj/buildmode/C = new/obj/buildmode(H)
|
||||
var/obj/bmode/buildmode/C = new/obj/bmode/buildmode(H)
|
||||
C.master = H
|
||||
var/obj/buildquit/D = new/obj/buildquit(H)
|
||||
var/obj/bmode/buildquit/D = new/obj/bmode/buildquit(H)
|
||||
D.master = H
|
||||
|
||||
H.builddir = A
|
||||
@@ -34,59 +34,18 @@
|
||||
M.client.screen += D
|
||||
H.cl = M.client
|
||||
|
||||
/obj/builddir
|
||||
/obj/bmode//Cleaning up the tree a bit
|
||||
density = 1
|
||||
anchored = 1
|
||||
layer = 20
|
||||
dir = NORTH
|
||||
icon = 'buildmode.dmi'
|
||||
var/obj/bmode/buildholder/master = null
|
||||
|
||||
/obj/bmode/builddir
|
||||
icon_state = "build"
|
||||
screen_loc = "NORTH,WEST"
|
||||
var/obj/buildholder/master = null
|
||||
/obj/buildhelp
|
||||
density = 1
|
||||
anchored = 1
|
||||
layer = 20
|
||||
dir = NORTH
|
||||
icon = 'buildmode.dmi'
|
||||
icon_state = "buildhelp"
|
||||
screen_loc = "NORTH,WEST+1"
|
||||
var/obj/buildholder/master = null
|
||||
/obj/buildmode
|
||||
density = 1
|
||||
anchored = 1
|
||||
layer = 20
|
||||
dir = NORTH
|
||||
icon = 'buildmode.dmi'
|
||||
icon_state = "buildmode1"
|
||||
screen_loc = "NORTH,WEST+2"
|
||||
var/obj/buildholder/master = null
|
||||
var/varholder = "name"
|
||||
var/valueholder = "derp"
|
||||
var/objholder = "/obj/closet"
|
||||
/obj/buildquit
|
||||
density = 1
|
||||
anchored = 1
|
||||
layer = 20
|
||||
dir = NORTH
|
||||
icon = 'buildmode.dmi'
|
||||
icon_state = "buildquit"
|
||||
screen_loc = "NORTH,WEST+3"
|
||||
var/obj/buildholder/master = null
|
||||
|
||||
/obj/buildquit/Click()
|
||||
togglebuildmode(master.cl.mob)
|
||||
|
||||
/obj/buildholder
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/client/cl = null
|
||||
var/obj/builddir/builddir = null
|
||||
var/obj/buildhelp/buildhelp = null
|
||||
var/obj/buildmode/buildmode = null
|
||||
var/obj/buildquit/buildquit = null
|
||||
|
||||
/obj/builddir/Click()
|
||||
Click()
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
dir = EAST
|
||||
@@ -98,8 +57,13 @@
|
||||
dir = NORTHWEST
|
||||
if(NORTHWEST)
|
||||
dir = NORTH
|
||||
return
|
||||
|
||||
/obj/buildhelp/Click()
|
||||
/obj/bmode/buildhelp
|
||||
icon = 'buildmode.dmi'
|
||||
icon_state = "buildhelp"
|
||||
screen_loc = "NORTH,WEST+1"
|
||||
Click()
|
||||
switch(master.cl.buildmode)
|
||||
if(1)
|
||||
usr << "\blue ***********************************************************"
|
||||
@@ -126,8 +90,38 @@
|
||||
usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value"
|
||||
usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value"
|
||||
usr << "\blue ***********************************************************"
|
||||
if(4)
|
||||
usr << "\blue ***********************************************************"
|
||||
usr << "\blue Left Mouse Button on turf/obj/mob = Throw"
|
||||
usr << "\blue Right Mouse Button on turf/obj/mob = Select"
|
||||
usr << "\blue ***********************************************************"
|
||||
return
|
||||
|
||||
/obj/buildmode/Click(location, control, params)
|
||||
/obj/bmode/buildquit
|
||||
icon_state = "buildquit"
|
||||
screen_loc = "NORTH,WEST+3"
|
||||
|
||||
Click()
|
||||
togglebuildmode(master.cl.mob)
|
||||
|
||||
/obj/bmode/buildholder
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/client/cl = null
|
||||
var/obj/bmode/builddir/builddir = null
|
||||
var/obj/bmode/buildhelp/buildhelp = null
|
||||
var/obj/bmode/buildmode/buildmode = null
|
||||
var/obj/bmode/buildquit/buildquit = null
|
||||
var/atom/movable/throw_atom = null
|
||||
|
||||
/obj/bmode/buildmode
|
||||
icon_state = "buildmode1"
|
||||
screen_loc = "NORTH,WEST+2"
|
||||
var/varholder = "name"
|
||||
var/valueholder = "derp"
|
||||
var/objholder = "/obj/closet"
|
||||
|
||||
Click(location, control, params)
|
||||
var/list/pa = params2list(params)
|
||||
|
||||
if(pa.Find("left"))
|
||||
@@ -139,8 +133,12 @@
|
||||
master.cl.buildmode = 3
|
||||
src.icon_state = "buildmode3"
|
||||
if(3)
|
||||
master.cl.buildmode = 4
|
||||
src.icon_state = "buildmode4"
|
||||
if(4)
|
||||
master.cl.buildmode = 1
|
||||
src.icon_state = "buildmode1"
|
||||
|
||||
else if(pa.Find("right"))
|
||||
switch(master.cl.buildmode)
|
||||
if(1)
|
||||
@@ -175,20 +173,15 @@
|
||||
|
||||
|
||||
/proc/build_click(var/mob/user, buildmode, location, control, params, var/obj/object)
|
||||
|
||||
var/obj/buildholder/holder = null
|
||||
|
||||
for(var/obj/buildholder/H)
|
||||
var/obj/bmode/buildholder/holder = null
|
||||
for(var/obj/bmode/buildholder/H)
|
||||
if(H.cl == user.client)
|
||||
holder = H
|
||||
break
|
||||
|
||||
if(!holder) return
|
||||
var/list/pa = params2list(params)
|
||||
|
||||
|
||||
switch(buildmode)
|
||||
|
||||
if(1)
|
||||
if(istype(object,/turf) && pa.Find("left") && !pa.Find("alt") && !pa.Find("ctrl") )
|
||||
if(istype(object,/turf/space))
|
||||
@@ -203,7 +196,6 @@
|
||||
var/turf/T = object
|
||||
T.ReplaceWithRWall()
|
||||
return
|
||||
|
||||
else if(pa.Find("right"))
|
||||
if(istype(object,/turf/simulated/wall))
|
||||
var/turf/T = object
|
||||
@@ -220,10 +212,8 @@
|
||||
else if(istype(object,/obj))
|
||||
del(object)
|
||||
return
|
||||
|
||||
else if(istype(object,/turf) && pa.Find("alt") && pa.Find("left"))
|
||||
new/obj/machinery/door/airlock(get_turf(object))
|
||||
|
||||
else if(istype(object,/turf) && pa.Find("ctrl") && pa.Find("left"))
|
||||
switch(holder.builddir.dir)
|
||||
if(NORTH)
|
||||
@@ -253,7 +243,6 @@
|
||||
if(pa.Find("left")) //I cant believe this shit actually compiles.
|
||||
if(object.vars.Find(holder.buildmode.varholder))
|
||||
log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
|
||||
// message_admins("[key_name_admin(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]", 1)
|
||||
object.vars[holder.buildmode.varholder] = holder.buildmode.valueholder
|
||||
blink(object)
|
||||
else
|
||||
@@ -261,14 +250,20 @@
|
||||
if(pa.Find("right"))
|
||||
if(object.vars.Find(holder.buildmode.varholder))
|
||||
log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
|
||||
// message_admins("[key_name_admin(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]", 1)
|
||||
object.vars[holder.buildmode.varholder] = initial(object.vars[holder.buildmode.varholder])
|
||||
blink(object)
|
||||
else
|
||||
usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'"
|
||||
|
||||
if(4)
|
||||
if(pa.Find("left"))
|
||||
holder.throw_atom = object
|
||||
if(pa.Find("right"))
|
||||
if(holder.throw_atom)
|
||||
holder.throw_atom.throw_at(object, 10, 1)
|
||||
|
||||
/proc/blink(atom/A)
|
||||
A.icon += rgb(0,75,75)
|
||||
spawn(10)
|
||||
spawn(5)
|
||||
if(A)
|
||||
A.icon = initial(A.icon)
|
||||
|
||||
@@ -1,329 +0,0 @@
|
||||
/obj/item/projectile/hivebotbullet
|
||||
damage = 5
|
||||
mobdamage = list(BRUTE = 5, BURN = 0, TOX = 0, OXY = 0, CLONE = 0)
|
||||
|
||||
/obj/hivebot
|
||||
name = "Hivebot"
|
||||
desc = "A small robot"
|
||||
icon = 'Hivebot.dmi'
|
||||
icon_state = "basic"
|
||||
layer = 5.0
|
||||
density = 1
|
||||
anchored = 0
|
||||
var
|
||||
alive = 1
|
||||
health = 10
|
||||
task = "thinking"
|
||||
aggressive = 1
|
||||
wanderer = 1
|
||||
opensdoors = 1
|
||||
frustration = 0
|
||||
last_found = null
|
||||
target = null
|
||||
oldtarget_name = null
|
||||
target_lastloc = null
|
||||
atkcarbon = 1
|
||||
atksilicon = 0
|
||||
attack = 0
|
||||
attacking = 0
|
||||
steps = 0
|
||||
firevuln = 0.5
|
||||
brutevuln = 1
|
||||
seekrange = 8
|
||||
basic_damage = 2
|
||||
armor = 5
|
||||
proc
|
||||
patrol_step()
|
||||
process()
|
||||
seek_target()
|
||||
Die()
|
||||
ChaseAttack(mob/M)
|
||||
RunAttack(mob/M)
|
||||
Shoot(var/target, var/start, var/user, var/bullet = 0)
|
||||
TakeDamage(var/damage = 0)
|
||||
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/living/user as mob)
|
||||
..()
|
||||
if (!src.alive) return
|
||||
var/damage = 0
|
||||
switch(W.damtype)
|
||||
if("fire") damage = W.force * firevuln
|
||||
if("brute") damage = W.force * brutevuln
|
||||
TakeDamage(damage)
|
||||
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
if (!src.alive) return
|
||||
if (user.a_intent == "hurt")
|
||||
TakeDamage(2 * brutevuln)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <b>[user]</b> punches [src]!", 1)
|
||||
playsound(src.loc, pick('punch1.ogg','punch2.ogg','punch3.ogg','punch4.ogg'), 100, 1)
|
||||
|
||||
|
||||
patrol_step()
|
||||
var/moveto = locate(src.x + rand(-1,1),src.y + rand(-1, 1),src.z)
|
||||
if (istype(moveto, /turf/simulated/floor) || istype(moveto, /turf/simulated/shuttle/floor) || istype(moveto, /turf/unsimulated/floor)) step_towards(src, moveto)
|
||||
if(src.aggressive) seek_target()
|
||||
steps += 1
|
||||
if (steps == rand(5,20)) src.task = "thinking"
|
||||
|
||||
|
||||
Bump(M as mob|obj)
|
||||
spawn(0)
|
||||
if ((istype(M, /obj/machinery/door)))
|
||||
var/obj/machinery/door/D = M
|
||||
if (src.opensdoors)
|
||||
D.open()
|
||||
src.frustration = 0
|
||||
else src.frustration ++
|
||||
else if ((istype(M, /mob/living/)) && (!src.anchored))
|
||||
src.loc = M:loc
|
||||
src.frustration = 0
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
Bumped(M as mob|obj)
|
||||
spawn(0)
|
||||
var/turf/T = get_turf(src)
|
||||
M:loc = T
|
||||
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
TakeDamage(Proj.damage)
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.Die()
|
||||
return
|
||||
if(2.0)
|
||||
TakeDamage(20)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
emp_act(serverity)
|
||||
src.Die()//Currently why not
|
||||
return
|
||||
|
||||
|
||||
meteorhit()
|
||||
src.Die()
|
||||
return
|
||||
|
||||
|
||||
blob_act()
|
||||
if(prob(25))
|
||||
src.Die()
|
||||
return
|
||||
|
||||
|
||||
process()
|
||||
set background = 1
|
||||
if (!src.alive) return
|
||||
switch(task)
|
||||
if("thinking")
|
||||
src.attack = 0
|
||||
src.target = null
|
||||
sleep(15)
|
||||
walk_to(src,0)
|
||||
if (src.aggressive) seek_target()
|
||||
if (src.wanderer && !src.target) src.task = "wandering"
|
||||
if("chasing")
|
||||
if (src.frustration >= 8)
|
||||
src.target = null
|
||||
src.last_found = world.time
|
||||
src.frustration = 0
|
||||
src.task = "thinking"
|
||||
walk_to(src,0)
|
||||
if (target)
|
||||
if (get_dist(src, src.target) <= 1)
|
||||
var/mob/living/carbon/M = src.target
|
||||
ChaseAttack(M)
|
||||
src.task = "attacking"
|
||||
src.anchored = 1
|
||||
src.target_lastloc = M.loc
|
||||
else
|
||||
var/turf/olddist = get_dist(src, src.target)
|
||||
walk_to(src, src.target,1,4)
|
||||
if ((get_dist(src, src.target)) >= (olddist))
|
||||
src.frustration++
|
||||
else
|
||||
src.frustration = 0
|
||||
sleep(5)
|
||||
else src.task = "thinking"
|
||||
if("attacking")
|
||||
// see if he got away
|
||||
if ((get_dist(src, src.target) > 1) || ((src.target:loc != src.target_lastloc)))
|
||||
src.anchored = 0
|
||||
src.task = "chasing"
|
||||
else
|
||||
if (get_dist(src, src.target) <= 1)
|
||||
var/mob/living/carbon/M = src.target
|
||||
if (!src.attacking) RunAttack(src.target)
|
||||
if (!src.aggressive)
|
||||
src.task = "thinking"
|
||||
src.target = null
|
||||
src.anchored = 0
|
||||
src.last_found = world.time
|
||||
src.frustration = 0
|
||||
src.attacking = 0
|
||||
else
|
||||
if(M!=null)
|
||||
if (M.health < 0)
|
||||
src.task = "thinking"
|
||||
src.target = null
|
||||
src.anchored = 0
|
||||
src.last_found = world.time
|
||||
src.frustration = 0
|
||||
src.attacking = 0
|
||||
else
|
||||
src.anchored = 0
|
||||
src.attacking = 0
|
||||
src.task = "chasing"
|
||||
if("wandering")
|
||||
patrol_step()
|
||||
sleep(10)
|
||||
spawn(8)
|
||||
process()
|
||||
return
|
||||
|
||||
|
||||
New()
|
||||
spawn(0) process()
|
||||
..()
|
||||
|
||||
|
||||
seek_target()
|
||||
src.anchored = 0
|
||||
for (var/mob/living/C in view(src.seekrange,src))
|
||||
if (src.target)
|
||||
src.task = "chasing"
|
||||
break
|
||||
if ((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
|
||||
if (istype(C, /mob/living/carbon/) && !src.atkcarbon) continue
|
||||
if (istype(C, /mob/living/silicon/) && !src.atksilicon) continue
|
||||
if (C.health < 0) continue
|
||||
if (istype(C, /mob/living/carbon/) && src.atkcarbon) src.attack = 1
|
||||
if (istype(C, /mob/living/silicon/) && src.atksilicon) src.attack = 1
|
||||
|
||||
if (src.attack)
|
||||
src.target = C
|
||||
src.oldtarget_name = C.name
|
||||
src.task = "chasing"
|
||||
break
|
||||
else
|
||||
continue
|
||||
|
||||
|
||||
Die()
|
||||
if (!src.alive) return
|
||||
src.alive = 0
|
||||
walk_to(src,0)
|
||||
src.visible_message("<b>[src]</b> blows apart!")
|
||||
var/turf/Ts = get_turf(src)
|
||||
new /obj/decal/cleanable/robot_debris(Ts)
|
||||
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
del(src)
|
||||
|
||||
|
||||
TakeDamage(var/damage = 0)
|
||||
var/tempdamage = (damage-armor)
|
||||
if(tempdamage > 0)
|
||||
src.health -= tempdamage
|
||||
else
|
||||
src.health--
|
||||
if(src.health <= 0)
|
||||
src.Die()
|
||||
|
||||
|
||||
ChaseAttack(mob/M)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src]</B> leaps at [src.target]!", 1)
|
||||
|
||||
|
||||
RunAttack(mob/M)
|
||||
src.attacking = 1
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src]</B> claws at [src.target]!", 1)
|
||||
src.target:bruteloss += basic_damage
|
||||
spawn(25)
|
||||
src.attacking = 0
|
||||
|
||||
|
||||
Shoot(var/target, var/start, var/user, var/bullet = 0)
|
||||
if(target == start)
|
||||
return
|
||||
|
||||
var/obj/item/projectile/hivebotbullet/A = new /obj/item/projectile/hivebotbullet(user:loc)
|
||||
playsound(user, 'Gunshot.ogg', 100, 1)
|
||||
|
||||
if(!A) return
|
||||
|
||||
if (!istype(target, /turf))
|
||||
del(A)
|
||||
return
|
||||
A.current = target
|
||||
A.yo = target:y - start:y
|
||||
A.xo = target:x - start:x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
return
|
||||
|
||||
|
||||
/obj/hivebot/range
|
||||
name = "Hivebot"
|
||||
desc = "A smallish robot, this one is armed!"
|
||||
var/rapid = 0
|
||||
|
||||
seek_target()
|
||||
src.anchored = 0
|
||||
for (var/mob/living/C in view(src.seekrange,src))
|
||||
if (!src.alive) break
|
||||
if (C.health < 0) continue
|
||||
if (istype(C, /mob/living/carbon/) && src.atkcarbon) src.attack = 1
|
||||
if (istype(C, /mob/living/silicon/) && src.atksilicon) src.attack = 1
|
||||
|
||||
if (src.attack)
|
||||
src.target = C
|
||||
src.oldtarget_name = C.name
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <b>[src]</b> fires at [src.target]!", 1)
|
||||
|
||||
var/tturf = get_turf(target)
|
||||
if(rapid)
|
||||
spawn(1)
|
||||
Shoot(tturf, src.loc, src)
|
||||
spawn(4)
|
||||
Shoot(tturf, src.loc, src)
|
||||
spawn(6)
|
||||
Shoot(tturf, src.loc, src)
|
||||
else
|
||||
Shoot(tturf, src.loc, src)
|
||||
|
||||
src.attack = 0
|
||||
sleep(12)
|
||||
seek_target()
|
||||
src.task = "thinking"
|
||||
break
|
||||
else continue
|
||||
|
||||
/obj/hivebot/range/rapid
|
||||
rapid = 1
|
||||
|
||||
/obj/hivebot/range/strong
|
||||
name = "Strong Hivebot"
|
||||
desc = "A robot, this one is armed and looks tough!"
|
||||
health = 50
|
||||
armor = 10
|
||||
|
||||
/obj/hivebot/range/borgkill
|
||||
health = 20
|
||||
atksilicon = 1
|
||||
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
/obj/hivebot/tele//this still needs work
|
||||
name = "Beacon"
|
||||
desc = "Some odd beacon thing"
|
||||
icon = 'Hivebot.dmi'
|
||||
icon_state = "def_radar-off"
|
||||
health = 200
|
||||
task = "thinking"
|
||||
aggressive = 0
|
||||
wanderer = 0
|
||||
armor = 5
|
||||
|
||||
var
|
||||
bot_type = "norm"
|
||||
bot_amt = 10
|
||||
spawn_delay = 600
|
||||
set_spawn = 0
|
||||
auto_spawn = 1
|
||||
proc
|
||||
warpbots()
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread()
|
||||
smoke.set_up(5, 0, src.loc)
|
||||
smoke.start()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>The [src] warps in!</B>", 1)
|
||||
playsound(src.loc, 'EMPulse.ogg', 25, 1)
|
||||
if(auto_spawn)
|
||||
spawn(spawn_delay)
|
||||
warpbots()
|
||||
|
||||
|
||||
warpbots()
|
||||
icon_state = "def_radar"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red The [src] turns on!", 1)
|
||||
while(bot_amt > 0)
|
||||
bot_amt--
|
||||
switch(bot_type)
|
||||
if("norm")
|
||||
new /obj/hivebot(get_turf(src))
|
||||
if("range")
|
||||
new /obj/hivebot/range(get_turf(src))
|
||||
if("rapid")
|
||||
new /obj/hivebot/range/rapid(get_turf(src))
|
||||
spawn(100)
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
process()
|
||||
if(set_spawn)
|
||||
warpbots()
|
||||
..()
|
||||
|
||||
|
||||
/obj/hivebot/tele/massive
|
||||
bot_type = "norm"
|
||||
bot_amt = 30
|
||||
auto_spawn = 0
|
||||
|
||||
|
||||
/obj/hivebot/tele/range
|
||||
bot_type = "range"
|
||||
bot_amt = 10
|
||||
|
||||
|
||||
/obj/hivebot/tele/rapid
|
||||
bot_type = "rapid"
|
||||
bot_amt = 10
|
||||
@@ -145,7 +145,7 @@
|
||||
invocation_type = "shout"
|
||||
range = 1
|
||||
|
||||
summon_type = list("/obj/livestock/spesscarp/elite")
|
||||
summon_type = list("/obj/critter/spesscarp/elite")
|
||||
|
||||
/obj/proc_holder/spell/targeted/trigger/blind
|
||||
name = "Blind"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
var/crit_fail = 0
|
||||
var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj.
|
||||
animate_movement = 2
|
||||
var/throwforce = 0
|
||||
var/throwforce = 1
|
||||
proc
|
||||
handle_internal_lifeform(mob/lifeform_inside_me, breath_request)
|
||||
//Return: (NONSTANDARD)
|
||||
@@ -34,6 +34,7 @@
|
||||
attack_hand(mob/user as mob)
|
||||
switch(alert("Travel back to ss13?",,"Yes","No"))
|
||||
if("Yes")
|
||||
if(user.z != src.z) return
|
||||
user.loc.loc.Exited(user)
|
||||
user.loc = pick(latejoin)
|
||||
if("No")
|
||||
@@ -281,8 +282,8 @@
|
||||
name = "item"
|
||||
icon = 'items.dmi'
|
||||
var/icon_old = null//For when weapons get bloodied this saves their old icon.
|
||||
var/abstract = 0.0
|
||||
var/force = null
|
||||
var/abstract = 0
|
||||
var/force = 0
|
||||
var/item_state = null
|
||||
var/damtype = "brute"
|
||||
var/r_speed = 1.0
|
||||
@@ -982,18 +983,6 @@
|
||||
src.pixel_x = rand(-5, 5)
|
||||
src.pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/weapon/storage
|
||||
icon = 'storage.dmi'
|
||||
name = "storage"
|
||||
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
|
||||
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
|
||||
var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set)
|
||||
var/max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
|
||||
var/storage_slots = 7 //The number of storage slots in this container.
|
||||
var/obj/screen/storage/boxes = null
|
||||
var/obj/screen/close/closer = null
|
||||
w_class = 3.0
|
||||
|
||||
|
||||
/*
|
||||
/obj/item/weapon/storage/glassbox
|
||||
|
||||
@@ -1324,7 +1324,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato/attack_self(mob/user as mob)
|
||||
if(istype(user.loc,/turf/space))
|
||||
return
|
||||
new /obj/livestock/killertomato(user.loc)
|
||||
new /obj/critter/killertomato(user.loc)
|
||||
|
||||
del(src)
|
||||
|
||||
@@ -1481,7 +1481,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob)
|
||||
if(istype(user.loc,/turf/space))
|
||||
return
|
||||
new /obj/livestock/walkingmushroom(user.loc)
|
||||
new /obj/critter/walkingmushroom(user.loc)
|
||||
|
||||
del(src)
|
||||
|
||||
|
||||
@@ -89,14 +89,7 @@
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/survival_kit
|
||||
name = "Centcom Survival Kit"
|
||||
desc = "How nice of CentCom to provide us with some stuff to make our lives easier."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/survival_kit/engineer
|
||||
name = "Centcom Engineer Kit"
|
||||
/obj/item/weapon/storage/box/engineer
|
||||
|
||||
/obj/item/weapon/storage/box/syndicate
|
||||
|
||||
|
||||
@@ -1118,44 +1118,10 @@
|
||||
throw_range = 15
|
||||
//layer = 4
|
||||
|
||||
|
||||
/obj/item/weapon/paper/Internal
|
||||
name = "paper- 'Internal Atmosphere Operating Instructions'"
|
||||
info = "Equipment:<BR>\n\t1+ Tank(s) with appropriate atmosphere<BR>\n\t1 Gas Mask w regulator (standard issue)<BR>\n<BR>\nProcedure:<BR>\n\t1. Wear mask<BR>\n\t2. Attach oxygen tank pipe to regulater (automatic))<BR>\n\t3. Set internal!<BR>\n<BR>\nNotes:<BR>\n\tDon't forget to stop internal when tank is low by<BR>\n\tremoving internal!<BR>\n<BR>\n\tDo not use a tank that has a high concentration of toxins.<BR>\n\tThe filters shut down on internal mode!<BR>\n<BR>\n\tWhen exiting a high danger environment it is advised<BR>\n\tthat you exit through a decontamination zone!<BR>\n<BR>\n\tRefill a tank at a oxygen canister by equiping the tank (Double Click)<BR>\n\tthen 'attacking' the canister (Double Click the canister)."
|
||||
|
||||
/obj/item/weapon/paper/Court
|
||||
name = "paper- 'Judgement'"
|
||||
info = "For crimes against the station, the offender is sentenced to:<BR>\n<BR>\n"
|
||||
|
||||
/obj/item/weapon/paper/Map
|
||||
name = "paper- 'Station Blueprint'"
|
||||
var/map_graphic = 'map.png'
|
||||
info = {"<IMG SRC="ss13mapd.png">
|
||||
<BR>
|
||||
CQ: Crew Quarters<BR>
|
||||
L: Lounge<BR>
|
||||
CH: Chapel<BR>
|
||||
ENG: Engine Area<BR>
|
||||
EC: Engine Control<BR>
|
||||
ES: Engine Storage<BR>
|
||||
GR: Generator Room<BR>
|
||||
MB: Medical Bay<BR>
|
||||
MR: Medical Research<BR>
|
||||
TR: Toxin Research<BR>
|
||||
TS: Toxin Storage<BR>
|
||||
AC: Atmospheric Control<BR>
|
||||
SEC: Security<BR>
|
||||
SB: Shuttle Bay
|
||||
SA: Shuttle Airlock<BR>
|
||||
S: Storage<BR>
|
||||
CR: Control Room<BR>
|
||||
EV: EVA Storage<BR>
|
||||
AE: Aux. Engine<BR>
|
||||
P: Podbay<BR>
|
||||
NA: North Airlock<BR>
|
||||
SC: Solar Control<BR>
|
||||
ASC: Aux. Solar Control<BR>
|
||||
"}
|
||||
|
||||
/obj/item/weapon/paper/Toxin
|
||||
name = "paper- 'Chemical Information'"
|
||||
@@ -1188,38 +1154,6 @@ ASC: Aux. Solar Control<BR>
|
||||
name = "paper- 'Standard Operating Procedure'"
|
||||
info = "Alert Levels:<BR>\nBlue- Emergency<BR>\n\t1. Caused by fire<BR>\n\t2. Caused by manual interaction<BR>\n\tAction:<BR>\n\t\tClose all fire doors. These can only be opened by reseting the alarm<BR>\nRed- Ejection/Self Destruct<BR>\n\t1. Caused by module operating computer.<BR>\n\tAction:<BR>\n\t\tAfter the specified time the module will eject completely.<BR>\n<BR>\nEngine Maintenance Instructions:<BR>\n\tShut off ignition systems:<BR>\n\tActivate internal power<BR>\n\tActivate orbital balance matrix<BR>\n\tRemove volatile liquids from area<BR>\n\tWear a fire suit<BR>\n<BR>\n\tAfter<BR>\n\t\tDecontaminate<BR>\n\t\tVisit medical examiner<BR>\n<BR>\nToxin Laboratory Procedure:<BR>\n\tWear a gas mask regardless<BR>\n\tGet an oxygen tank.<BR>\n\tActivate internal atmosphere<BR>\n<BR>\n\tAfter<BR>\n\t\tDecontaminate<BR>\n\t\tVisit medical examiner<BR>\n<BR>\nDisaster Procedure:<BR>\n\tFire:<BR>\n\t\tActivate sector fire alarm.<BR>\n\t\tMove to a safe area.<BR>\n\t\tGet a fire suit<BR>\n\t\tAfter:<BR>\n\t\t\tAssess Damage<BR>\n\t\t\tRepair damages<BR>\n\t\t\tIf needed, Evacuate<BR>\n\tMeteor Shower:<BR>\n\t\tActivate fire alarm<BR>\n\t\tMove to the back of ship<BR>\n\t\tAfter<BR>\n\t\t\tRepair damage<BR>\n\t\t\tIf needed, Evacuate<BR>\n\tAccidental Reentry:<BR>\n\t\tActivate fire alrms in front of ship.<BR>\n\t\tMove volatile matter to a fire proof area!<BR>\n\t\tGet a fire suit.<BR>\n\t\tStay secure until an emergency ship arrives.<BR>\n<BR>\n\t\tIf ship does not arrive-<BR>\n\t\t\tEvacuate to a nearby safe area!"
|
||||
|
||||
/obj/item/weapon/paper/engine
|
||||
name = "paper- 'Generator Startup Procedure'"
|
||||
info = {"<B>Thermo-Electric Generator Startup Procedure for Mark I Plasma-Fired Engines</B>
|
||||
<HR>
|
||||
<i>Warning!</i> Improper engine and generator operation may cause exposure to hazardous gasses, extremes of heat and cold, and dangerous electrical voltages.<BR>
|
||||
Only trained personnel should operate station systems. Follow all procedures carefully. Wear correct personal protective equipment at all times.<BR>
|
||||
Refer to your supervisor or Head of Personnel for procedure updates and additional information.
|
||||
<HR>
|
||||
Standard checklist for engine and generator cold-start.<BR>
|
||||
<ol>
|
||||
<li>Perform visual inspection of external (cooling) and internal (heating) heat-exchange pipe loops.
|
||||
Refer any breaks or cracks in the pipe to Station Maintenance for repair before continuing.
|
||||
<li>Connect a CO<sub>2</sub> canister to the external (cooling) loop connector, and release the contents. Check loop pressurization is stable.<BR>
|
||||
<i>Note:</i> Observe standard canister safety procedures.<BR>
|
||||
<i>Note:</i> Other gasses may be substituted as a medium in the external (cooling) loop in the event that CO<sub>2</sub> is not available.
|
||||
<li>Connect a CO<sub>2</sub> canister to the internal (heating) loop connector, and release the contents. Check loop pressurization is stable.<BR>
|
||||
<i>Note:</i> Observe standard canister safety procedures.<BR>
|
||||
<i>Note:</i> Nitrogen may be substituted as a medium in the internal (heating) loop in the event that CO<sub>2</sub> is not available.
|
||||
<i>Do not use plasma in the internal (heating) pipe loop as an unsafe condition may result.</i>
|
||||
<li>Using the thermo-electric generator (TEG) master control panel, engage the internal and external loop circulator pumps at 1% maximum rate.<BR>
|
||||
<li>Ignite the engine. Refer to document NTRSN-113-H9-12939 for proper engine preparation, ignition, and plasma-oxygen loading procedures.<BR>
|
||||
<i>Note:</i> Exceeding recommended plasma-oxygen concentrations can cause engine damage and potential hazards.
|
||||
<li>Monitor engine temperatures until stable operation is achieved.
|
||||
<li>Increase internal and external circulator pumps to 10% of maximum rate. Monitor the generated power output on the TEG control panel.<BR>
|
||||
<i>Note:</i> Consult appendix A for expected electrical generation rates.
|
||||
<li>Adjust circulator rates until required electrical demand is met.<BR>
|
||||
<i>Note:</i> Generation rate varies with internal and external loop temperatures, exchange media pressure, and engine geometry. Refer to Appendix B or your supervisor for locally determined optimal settings.<BR>
|
||||
<i>Note:</i> Do not exceed safety ratings for station power cabling and electrical equipment.
|
||||
<li>With the power generation rate stable, engage charging of the superconducting magnetic energy storage (SMES) devices.
|
||||
Total SMES charging rate should not exceed total power generation rate, or an overload condition may occur.
|
||||
"}
|
||||
|
||||
/obj/item/weapon/paper_bin
|
||||
name = "Paper Bin"
|
||||
desc = "This contains many papers."
|
||||
|
||||
@@ -146,9 +146,9 @@ proc/admin_spawn_room_at_pos()
|
||||
return
|
||||
|
||||
var/global/list/space_surprises = list(/obj/alien/facehugger,
|
||||
/obj/livestock/spesscarp,
|
||||
/obj/livestock/spesscarp/elite,
|
||||
/obj/creature,
|
||||
/obj/critter/spesscarp,
|
||||
/obj/critter/spesscarp/elite,
|
||||
// /obj/creature,
|
||||
/obj/item/weapon/rcd,
|
||||
/obj/item/weapon/rcd_ammo,
|
||||
/obj/item/weapon/spacecash,
|
||||
|
||||
@@ -341,9 +341,9 @@
|
||||
for(var/obj/landmark/C in world)
|
||||
if(C.name == "carpspawn")
|
||||
if(prob(99))
|
||||
new /obj/livestock/spesscarp(C.loc)
|
||||
new /obj/critter/spesscarp(C.loc)
|
||||
else
|
||||
new /obj/livestock/spesscarp/elite(C.loc)
|
||||
new /obj/critter/spesscarp/elite(C.loc)
|
||||
sleep(100)
|
||||
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
world << sound('commandreport.ogg')
|
||||
|
||||
@@ -147,7 +147,7 @@ datum/hSB
|
||||
continue
|
||||
if(istype(O, /obj/item/device/shield))
|
||||
continue
|
||||
if(istype(O, /obj/hivebot))
|
||||
if(istype(O, /obj/critter))
|
||||
continue
|
||||
if(istype(O, /obj/structure))
|
||||
continue
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
wizard_mob.equip_if_possible(new /obj/item/clothing/suit/wizrobe(wizard_mob), wizard_mob.slot_wear_suit)
|
||||
wizard_mob.equip_if_possible(new /obj/item/clothing/head/wizard(wizard_mob), wizard_mob.slot_head)
|
||||
wizard_mob.equip_if_possible(new /obj/item/weapon/storage/backpack(wizard_mob), wizard_mob.slot_back)
|
||||
wizard_mob.equip_if_possible(new /obj/item/weapon/storage/survival_kit(wizard_mob), wizard_mob.slot_in_backpack)
|
||||
wizard_mob.equip_if_possible(new /obj/item/weapon/storage/box(wizard_mob), wizard_mob.slot_in_backpack)
|
||||
// wizard_mob.equip_if_possible(new /obj/item/weapon/scrying_gem(wizard_mob), wizard_mob.slot_l_store) For scrying gem.
|
||||
wizard_mob.equip_if_possible(new /obj/item/weapon/teleportation_scroll(wizard_mob), wizard_mob.slot_r_store)
|
||||
if(config.feature_object_spell_system) //if it's turned on (in config.txt), spawns an object spell spellbook
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/geneticist(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/medical(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/white(src), slot_shoes)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/labcoat/genetics(src), slot_wear_suit)
|
||||
src.equip_if_possible(new /obj/item/device/flashlight/pen(src), slot_s_store)
|
||||
@@ -196,7 +196,7 @@
|
||||
|
||||
if ("Clown")
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/clown (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/clown(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes)
|
||||
@@ -210,7 +210,7 @@
|
||||
|
||||
if ("Mime")
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/mime(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/mime(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), slot_shoes)
|
||||
@@ -228,7 +228,7 @@
|
||||
|
||||
if ("Station Engineer")
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit/engineer(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box/engineer(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_eng (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/engineer(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/engineering(src), slot_belt)
|
||||
@@ -240,7 +240,7 @@
|
||||
|
||||
if ("Shaft Miner")
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_mine (src), slot_ears)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/miner(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), slot_shoes)
|
||||
@@ -255,7 +255,7 @@
|
||||
if ("Detective")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_sec (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/det(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/detective(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/brown(src), slot_shoes)
|
||||
@@ -274,7 +274,7 @@
|
||||
if ("Medical Doctor")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_med (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/medical(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/white(src), slot_shoes)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/labcoat(src), slot_wear_suit)
|
||||
@@ -285,7 +285,7 @@
|
||||
if ("Captain")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/heads/captain (src), slot_ears)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/captain(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/captain(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/armor/captain(src), slot_wear_suit)
|
||||
@@ -298,7 +298,7 @@
|
||||
if ("Security Officer")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_sec (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/security (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/security(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/security(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/armor/vest(src), slot_wear_suit)
|
||||
@@ -310,7 +310,7 @@
|
||||
if ("Warden")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_sec (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/security (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/warden(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/security(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/armor/vest(src), slot_wear_suit)
|
||||
@@ -342,7 +342,7 @@
|
||||
src.equip_if_possible(new /obj/item/clothing/head/helmet/HoS(src), slot_head)
|
||||
src.equip_if_possible(new /obj/item/clothing/mask/gas/emergency(src), slot_wear_mask)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/security (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
|
||||
src.equip_if_possible(new /obj/item/weapon/handcuffs(src), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/gun/energy(src), slot_s_store)
|
||||
@@ -351,7 +351,7 @@
|
||||
if ("Head of Personnel")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/heads/hop (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/head_of_personnel(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/heads/hop(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/armor/vest(src), slot_wear_suit)
|
||||
@@ -370,7 +370,7 @@
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), slot_shoes)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/armor/vest(src), slot_wear_suit)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(src), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(src), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(src), slot_in_backpack)
|
||||
@@ -388,7 +388,7 @@
|
||||
src.equip_if_possible(new /obj/item/device/pda/engineering(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), slot_shoes)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/labcoat(src), slot_wear_suit)
|
||||
src.equip_if_possible(new /obj/item/clothing/gloves/black(src), slot_gloves)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/toolbox/mechanical(src), slot_l_hand)
|
||||
@@ -411,7 +411,7 @@
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/brown(src), slot_shoes)
|
||||
src.equip_if_possible(new /obj/item/clothing/suit/suit(src), slot_wear_suit)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/device/detective_scanner(src), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/briefcase(src), slot_l_hand)
|
||||
|
||||
@@ -433,7 +433,7 @@
|
||||
|
||||
if ("Chief Engineer")
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit/engineer(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box/engineer(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/heads/ce (src), slot_ears)
|
||||
src.equip_if_possible(new /obj/item/clothing/gloves/black(src), slot_gloves) //changed to black as part of dangercon 2011, approved by Urist_McDorf --Errorage
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/brown(src), slot_shoes)
|
||||
@@ -459,7 +459,7 @@
|
||||
if ("Chief Medical Officer")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/heads/cmo (src), slot_ears)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/shoes/brown(src), slot_shoes)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/chief_medical_officer(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/heads/cmo(src), slot_belt)
|
||||
@@ -470,7 +470,7 @@
|
||||
if ("Virologist")
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_medsci (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box(src.back), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/medical(src), slot_w_uniform)
|
||||
src.equip_if_possible(new /obj/item/device/pda/medical(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/mask/surgical(src), slot_wear_mask)
|
||||
@@ -532,7 +532,7 @@
|
||||
else
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset(src), slot_ears)
|
||||
var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(src)
|
||||
new /obj/item/weapon/storage/survival_kit(BPK)
|
||||
new /obj/item/weapon/storage/box(BPK)
|
||||
src.equip_if_possible(BPK, slot_back,1)
|
||||
|
||||
|
||||
|
||||
@@ -200,7 +200,7 @@ proc/dress_for_job_default(var/mob/living/carbon/human/employee as mob, var/job_
|
||||
|
||||
/*
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (src), slot_back)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/survival_kit/engineer(src), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack)
|
||||
src.equip_if_possible(new /obj/item/device/radio/headset/headset_eng (src), slot_ears) // -- TLE
|
||||
src.equip_if_possible(new /obj/item/device/pda/engineering(src), slot_belt)
|
||||
src.equip_if_possible(new /obj/item/clothing/under/rank/engineer(src), slot_w_uniform)
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
if(src.check_access(bot.botcard))
|
||||
if(density)
|
||||
open()
|
||||
else if(istype(AM, /obj/livestock))
|
||||
var/obj/livestock/ani =AM
|
||||
if(src.check_access(ani.anicard))
|
||||
if(density)
|
||||
open()
|
||||
// else if(istype(AM, /obj/livestock))currently all access will fix later
|
||||
// var/obj/livestock/ani =AM
|
||||
// if(src.check_access(ani.anicard))
|
||||
// if(density)
|
||||
// open()
|
||||
else if(istype(AM, /obj/alien/facehugger))
|
||||
if(src.check_access(null))
|
||||
if(density)
|
||||
@@ -326,11 +326,6 @@
|
||||
if(src.check_access(bot.botcard))
|
||||
if(density)
|
||||
open()
|
||||
else if(istype(AM, /obj/livestock))
|
||||
var/obj/livestock/ani =AM
|
||||
if(src.check_access(ani.anicard))
|
||||
if(density)
|
||||
open()
|
||||
else if(istype(AM, /obj/alien/facehugger))
|
||||
if(src.check_access(null))
|
||||
if(density)
|
||||
|
||||
@@ -297,9 +297,8 @@ Neutralize All Unidentified Life Signs: []<BR>"},
|
||||
var/list/targets = list() // list of primary targets
|
||||
var/list/secondarytargets = list() // targets that are least important
|
||||
|
||||
if(src.check_anomalies) // if its set to check for xenos/carps, check for non-mob "livestock"
|
||||
for (var/obj/livestock/L in view(12,src))
|
||||
if(istype(L, /obj/livestock/spesscarp)) // git dose fukken space carps
|
||||
if(src.check_anomalies) // if its set to check for xenos/carps, check for non-mob "crittersssss"
|
||||
for (var/obj/critter/L in view(12,src))
|
||||
if(L.alive)
|
||||
targets += L
|
||||
|
||||
@@ -346,8 +345,8 @@ Neutralize All Unidentified Life Signs: []<BR>"},
|
||||
spawn() shootAt(M) // shoot the target, finally
|
||||
else
|
||||
|
||||
if (istype(t, /obj/livestock)) // shoot other things, same process as above
|
||||
var/obj/livestock/L = t
|
||||
if (istype(t, /obj/critter)) // shoot other things, same process as above
|
||||
var/obj/critter/L = t
|
||||
if (L.alive==1)
|
||||
spawn() popUp()
|
||||
dir=get_dir(src,L)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// Returns the surrounding cardinal turfs with open links
|
||||
// Including through doors openable with the ID
|
||||
// Includes spacetiles
|
||||
|
||||
/*
|
||||
|
||||
|
||||
/obj/creature
|
||||
@@ -294,3 +294,4 @@
|
||||
if (src.health <= 0)
|
||||
src.death()
|
||||
|
||||
*/
|
||||
@@ -1,26 +1,22 @@
|
||||
/obj/secure_closet/security1/New()
|
||||
..()
|
||||
sleep(2)
|
||||
//new /obj/item/weapon/storage/flashbang_kit(src)
|
||||
// Seriously gimping the number of flashes security get, will probably change later -- TLE
|
||||
new /obj/item/device/radio/headset/headset_sec(src)
|
||||
new /obj/item/weapon/flashbang(src)
|
||||
new /obj/item/weapon/handcuffs(src)
|
||||
new /obj/item/weapon/gun/energy/taser(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/weapon/melee/baton(src)
|
||||
new /obj/item/clothing/head/secsoft(src)
|
||||
return
|
||||
|
||||
/obj/secure_closet/security1/proc/prison_break()
|
||||
src.locked = 0
|
||||
src.icon_state = src.icon_closed
|
||||
|
||||
|
||||
/obj/secure_closet/security2/New()
|
||||
..()
|
||||
sleep(2)
|
||||
@@ -31,15 +27,9 @@
|
||||
new /obj/item/clothing/suit/det_suit( src )
|
||||
new /obj/item/clothing/suit/det_suit/armor( src )
|
||||
new /obj/item/weapon/storage/fcard_kit( src )
|
||||
new /obj/item/weapon/storage/fcard_kit( src )
|
||||
new /obj/item/weapon/storage/fcard_kit( src )
|
||||
new /obj/item/clothing/gloves/black( src )
|
||||
new /obj/item/weapon/storage/lglo_kit( src )
|
||||
new /obj/item/weapon/fcardholder( src )
|
||||
new /obj/item/weapon/fcardholder( src )
|
||||
new /obj/item/weapon/fcardholder( src )
|
||||
new /obj/item/weapon/fcardholder( src )
|
||||
new /obj/item/device/detective_scanner( src )
|
||||
new /obj/item/device/detective_scanner( src )
|
||||
return
|
||||
|
||||
@@ -64,13 +54,11 @@
|
||||
new /obj/item/weapon/shield/riot(src)
|
||||
new /obj/item/weapon/gun/energy( src )
|
||||
new /obj/item/device/flash( src )
|
||||
new /obj/item/weapon/storage/id_kit( src )
|
||||
new /obj/item/clothing/under/rank/head_of_security( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/glasses/sunglasses( src )
|
||||
new /obj/item/clothing/suit/armor/hos( src )
|
||||
new /obj/item/clothing/head/helmet( src )
|
||||
new /obj/item/weapon/storage/id_kit( src )
|
||||
new /obj/item/weapon/storage/flashbang_kit(src)
|
||||
new /obj/item/weapon/handcuffs(src)
|
||||
new /obj/item/weapon/melee/baton(src)
|
||||
|
||||
@@ -14,32 +14,18 @@
|
||||
return
|
||||
|
||||
/obj/closet/wardrobe/red/New()
|
||||
new /obj/item/clothing/under/color/red( src )
|
||||
new /obj/item/clothing/under/color/red( src )
|
||||
new /obj/item/clothing/under/color/red( src )
|
||||
new /obj/item/clothing/under/color/red( src )
|
||||
new /obj/item/clothing/under/color/red( src )
|
||||
new /obj/item/clothing/under/color/red( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
return
|
||||
/obj/closet/wardrobe/forensics_red/New()
|
||||
new /obj/item/clothing/under/rank/forensic_technician( src )
|
||||
new /obj/item/clothing/under/rank/forensic_technician( src )
|
||||
new /obj/item/clothing/under/rank/forensic_technician( src )
|
||||
new /obj/item/clothing/under/rank/forensic_technician( src )
|
||||
new /obj/item/clothing/under/rank/forensic_technician( src )
|
||||
new /obj/item/clothing/under/rank/forensic_technician( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/shoes/brown( src )
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/head/secsoft(src)
|
||||
new /obj/item/clothing/head/secsoft(src)
|
||||
new /obj/item/clothing/head/secsoft(src)
|
||||
new /obj/item/clothing/head/secsoft(src)
|
||||
return
|
||||
|
||||
/obj/closet/wardrobe/pink/New()
|
||||
|
||||
@@ -182,8 +182,8 @@
|
||||
nodamage = 1
|
||||
New()
|
||||
..()
|
||||
effects["radiation"] = 20
|
||||
effectprob["radiation"] = 95
|
||||
effects["radiation"] = 30
|
||||
effectprob["radiation"] = 99
|
||||
effects["drowsyness"] = 5
|
||||
effectprob["drowsyness"] = 10
|
||||
effectmod["radiation"] = ADD
|
||||
|
||||
@@ -33,21 +33,6 @@ CLIPBOARDS
|
||||
onclose(usr, "[src.name]")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/paper/Map/examine()
|
||||
set src in view()
|
||||
|
||||
..()
|
||||
|
||||
usr << browse_rsc(map_graphic)
|
||||
if (!( istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon) ))
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", src.name, stars(src.info)), text("window=[]", src.name))
|
||||
onclose(usr, "[src.name]")
|
||||
else
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", src.name, src.info), text("window=[]", src.name))
|
||||
onclose(usr, "[src.name]")
|
||||
return
|
||||
|
||||
/obj/item/weapon/pen/proc/formatText(var/s)
|
||||
if (text_size < 2 || text_size > 7)
|
||||
text_size = 3
|
||||
|
||||
@@ -1,574 +0,0 @@
|
||||
//Blatently copy/pasted from facehugger code + a few changes.
|
||||
|
||||
/obj/livestock
|
||||
name = "animal thing"
|
||||
desc = "This doesn't seem so bad..."
|
||||
icon = 'livestock.dmi'
|
||||
layer = 5.0
|
||||
density = 1
|
||||
anchored = 0
|
||||
unacidable = 1//While not technically mobs, these objects should not be affected by alien acid.
|
||||
|
||||
var/state = 0 //0 = null, 1 = attack, 2 = idle
|
||||
|
||||
var/list/path = new/list()
|
||||
|
||||
var/frustration = 0 //How long it's gone without reaching it's target.
|
||||
var/patience = 35 //The maximum time it'll chase a target.
|
||||
var/mob/living/carbon/target //Its combat target.
|
||||
var/list/mob/living/carbon/flee_from = new/list()
|
||||
var/list/path_target = new/list() //The path to the combat target.
|
||||
|
||||
var/turf/trg_idle //It's idle target, the one it's following but not attacking.
|
||||
var/list/path_idle = new/list() //The path to the idle target.
|
||||
|
||||
var/alive = 1 //1 alive, 0 dead
|
||||
var/maxhealth = 25
|
||||
var/health = 25
|
||||
var/aggressive = 0
|
||||
var/cowardly = 0 //PLEASE do not mix with agressive, I have no idea what its behaviour will be then
|
||||
flags = 258.0
|
||||
var/strength = 10 //The damage done by the creature if it attacks something.
|
||||
var/cycle_pause = 5
|
||||
var/view_range = 7 //How far it can see.
|
||||
var/obj/item/weapon/card/id/anicard //By default, animals can open doors but not any with access restrictions.
|
||||
var/intelligence = null // the intelligence var allows for additional access (by job).
|
||||
|
||||
var/species = "animal" //affects icon_state
|
||||
|
||||
New() //Initializes the livestock's AI and access
|
||||
..()
|
||||
anicard = new(src)
|
||||
if(!isnull(src.intelligence))
|
||||
anicard.access = get_access(intelligence)
|
||||
else
|
||||
anicard.access = null
|
||||
src.process()
|
||||
|
||||
examine()
|
||||
set src in view()
|
||||
..()
|
||||
if(!alive)
|
||||
usr << text("\red <B>The animal is not moving</B>")
|
||||
else if (src.health == src.health)
|
||||
usr << text("\red <B>The animal looks healthy.</B>")
|
||||
else
|
||||
usr << text("\red <B>The animal looks beat up</B>")
|
||||
if (aggressive && alive)
|
||||
usr << text("\red <B>Looks fierce!</B>")
|
||||
return
|
||||
|
||||
proc/gib() //Will move this to a generic livestock proc once I get some gib animations for the others -- Darem.
|
||||
var/atom/movable/overlay/animation = null
|
||||
src.icon = null
|
||||
src.invisibility = 101
|
||||
animation = new(src.loc)
|
||||
animation.icon = 'livestock.dmi'
|
||||
animation.icon_state = "blank"
|
||||
animation.master = src
|
||||
if(istype(src, /obj/livestock/spesscarp)) flick("spesscarp_g", animation)
|
||||
sleep(11)
|
||||
src.death(1)
|
||||
del(animation)
|
||||
return
|
||||
|
||||
|
||||
attack_hand(user as mob)
|
||||
return
|
||||
|
||||
attack_alien(var/mob/living/carbon/alien/user as mob) //So aliums can attack and potentially eat space carp.
|
||||
if(src.alive)
|
||||
if (user.a_intent == "help")
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\blue [user] caresses [src.name] with its scythe like arm."), 1)
|
||||
else
|
||||
src.health -= rand(15,30)
|
||||
if(src.aggressive)
|
||||
src.target = user
|
||||
src.state = 1
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has slashed [src.name]!</B>", user), 1)
|
||||
playsound(src.loc, 'slice.ogg', 25, 1, -1)
|
||||
if(prob(10)) new /obj/decal/cleanable/blood(src.loc)
|
||||
if (src.health <= 0)
|
||||
src.death()
|
||||
else
|
||||
if (user.a_intent == "grab")
|
||||
for(var/mob/N in viewers(user, null))
|
||||
if(N.client)
|
||||
N.show_message(text("\red <B>[user] is attempting to devour the carp!</B>"), 1)
|
||||
if(!do_after(user, 50)) return
|
||||
for(var/mob/N in viewers(user, null))
|
||||
if(N.client)
|
||||
N.show_message(text("\red <B>[user] hungrily devours the carp!</B>"), 1)
|
||||
user.health += rand(10,25)
|
||||
del(src)
|
||||
else
|
||||
user << "\green The creature is already dead."
|
||||
return
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(src.alive)
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
src.health -= W.force * 0.75
|
||||
if("brute")
|
||||
src.health -= W.force * 0.5
|
||||
else
|
||||
if (src.health <= 0)
|
||||
src.death()
|
||||
else if (W.force)
|
||||
if(src.aggressive && (ishuman(user) || ismonkey(user) || isrobot(user)))
|
||||
src.target = user
|
||||
src.state = 1
|
||||
if(prob(10)) new /obj/decal/cleanable/blood(src.loc)
|
||||
else if(istype(W, /obj/item/weapon/kitchenknife))
|
||||
user << "\red You slice open the [src.name]!"
|
||||
for (var/obj/item/I in src)
|
||||
I.loc = src.loc
|
||||
del(src)
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/butch))
|
||||
user << "\red You butcher open the [src.name]!"
|
||||
for (var/obj/item/I in src)
|
||||
I.loc = src.loc
|
||||
del(src)
|
||||
return
|
||||
..()
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
health -= Proj.damage
|
||||
if(istype(Proj, /obj/item/projectile/beam/pulse))
|
||||
if(prob(30))
|
||||
gib()
|
||||
if(prob(10)) new /obj/decal/cleanable/blood(src.loc)
|
||||
healthcheck()
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.death(1)
|
||||
if(2.0)
|
||||
src.health -= 15
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
meteorhit()
|
||||
src.gib()
|
||||
return
|
||||
|
||||
blob_act()
|
||||
if(prob(50))
|
||||
src.death()
|
||||
return
|
||||
|
||||
Bumped(AM as mob|obj)
|
||||
if(ismob(AM) && src.aggressive && (ishuman(AM) || ismonkey(AM)) )
|
||||
src.target = AM
|
||||
set_attack()
|
||||
else if(ismob(AM))
|
||||
spawn(0)
|
||||
var/turf/T = get_turf(src)
|
||||
AM:loc = T
|
||||
|
||||
Bump(atom/A)
|
||||
if(ismob(A) && src.aggressive && (ishuman(A) || ismonkey(A)))
|
||||
src.target = A
|
||||
set_attack()
|
||||
else if(ismob(A))
|
||||
src.loc = A:loc
|
||||
..()
|
||||
|
||||
temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
health -= 5
|
||||
healthcheck()
|
||||
|
||||
proc/set_attack()
|
||||
state = 1
|
||||
if(path_idle.len) path_idle = new/list()
|
||||
trg_idle = null
|
||||
|
||||
proc/set_idle()
|
||||
state = 2
|
||||
if (path_target.len) path_target = new/list()
|
||||
target = null
|
||||
frustration = 0
|
||||
|
||||
proc/set_null()
|
||||
state = 0
|
||||
if (path_target.len) path_target = new/list()
|
||||
if (path_idle.len) path_idle = new/list()
|
||||
target = null
|
||||
trg_idle = null
|
||||
frustration = 0
|
||||
|
||||
proc/special_extra() //Placeholder for animal specific effects such as cow milk or spess carp breathing.
|
||||
|
||||
proc/special_attack() //Placeholder for extra effects from the attack such as the carp's stun.
|
||||
|
||||
proc/special_target() //Placeholder for extra targeting protocol
|
||||
|
||||
proc/random_movement() //Unlike pick(cardinal), it has a bias towards continuing on in it's
|
||||
var/temp_move = null // original direction.
|
||||
switch(roll(1,20)) //50% => Foreward, 20% turn left, 20% turn right, 10% don't move.
|
||||
if(1 to 10)
|
||||
temp_move = src.dir
|
||||
if(11 to 14)
|
||||
temp_move = turn(src.dir, -90)
|
||||
if(15 to 18)
|
||||
temp_move = turn(src.dir, 90)
|
||||
if(!isnull(temp_move))
|
||||
step(src,temp_move)
|
||||
|
||||
proc/process() //Master AI proc.
|
||||
set background = 1
|
||||
if (!alive) //If it isn't alive, it shouldn't be doing anything.
|
||||
return
|
||||
if (cowardly) //cowardly = 1 stuff
|
||||
var/view = view_range-2 //Actual sight slightly lower then it's total sight.
|
||||
for (var/mob/living/carbon/C in range(view,src.loc)) //checking for threats
|
||||
if (((get_dir(src,C) & dir) || (C.m_intent=="run" && C.moved_recently)) && !(C in flee_from)) //if it can see or hear anyone nearby, start fleeing
|
||||
flee_from += C
|
||||
if (flee_from.len) //ohgodrun
|
||||
var/viable_dirs = 0
|
||||
for(var/mob/living/carbon/C in flee_from)
|
||||
if(!(C in view(src,view_range))) //first, see if someone who it has been fleeing from is still there. if not, delete that guy from the list
|
||||
flee_from -= C
|
||||
else
|
||||
viable_dirs |= get_dir(src,C)
|
||||
viable_dirs = 15 - viable_dirs //so it runs AWAY from those directions, not TOWARDS them
|
||||
if(viable_dirs) //if there is somewhere to run, DO IT DAMNIT
|
||||
var/list/turfs_to_move_to = new/list()
|
||||
for(var/turf/T in orange(src,1))
|
||||
if(((get_dir(src,T) & viable_dirs) == get_dir(src,T)) && !T.density)
|
||||
turfs_to_move_to += T
|
||||
src.Move(pick(turfs_to_move_to))
|
||||
if (aggressive) //aggressive = 1 stuff
|
||||
if (!target)
|
||||
if (path_target.len) path_target = new/list() //No target but there's still path data? reset it.
|
||||
var/last_health = INFINITY //Set as high as possible as an initial value.
|
||||
var/view = view_range-2 //Actual sight slightly lower then it's total sight.
|
||||
for (var/mob/living/carbon/C in range(view,src.loc)) //Checks all carbon creatures in range.
|
||||
if (!aggressive) //Is this animal angry? If not, what the fuck are you doing?
|
||||
break
|
||||
if (C.stat == 2 || !can_see(src,C,view_range) || (!can_see(src,C,(view_range / 2)) && C.invisibility >= 1))
|
||||
continue
|
||||
if(C:stunned || C:paralysis || C:weakened)
|
||||
target = C
|
||||
break
|
||||
if(C:health < last_health) //Selects the target but does NOT break the FOR loop.
|
||||
last_health = C:health // As such, it'll keep going until it finds the one with the
|
||||
target = C // lowest health.
|
||||
if(target) //Does it have a target NOW?
|
||||
if (aggressive) //Double checking if it is aggressive or not.
|
||||
set_attack()
|
||||
else if(state != 2) //If it doesn't have a target and it isn't idling already, idle.
|
||||
set_idle()
|
||||
idle()
|
||||
else if(target) //It already has a target? YAY!
|
||||
var/turf/distance = get_dist(src, target)
|
||||
if (src.aggressive) //I probably don't need this check, but just in case.
|
||||
set_attack()
|
||||
else
|
||||
set_idle()
|
||||
idle()
|
||||
if(can_see(src,target,view_range )) //Can I see it?
|
||||
if(distance <= 1) //Am I close enough to attack it?
|
||||
for(var/mob/O in viewers(world.view,src))
|
||||
O.show_message("\red <B>[src.target] has been attacked by [src.name]!</B>", 1, "\red You hear someone fall.", 2)
|
||||
target.take_organ_damage(strength)
|
||||
special_attack()
|
||||
src.loc = target.loc
|
||||
set_null()
|
||||
step_towards(src,get_step_towards2(src , target)) // Move towards the target.
|
||||
else
|
||||
if( !path_target.len ) //Don't have a path yet but do have a target?
|
||||
path_attack(target) //Find a path!
|
||||
if(!path_target.len) //Still no path?
|
||||
set_null() //Fuck this shit.
|
||||
if( path_target.len ) //Ok, I DO have a path
|
||||
var/turf/next = path_target[1] //Select the next square to move to.
|
||||
if(next in range(1,src)) //Is it next to it?
|
||||
path_attack(target) //Re-find path.
|
||||
if(!path_target.len) //If can't path to the target, it gets really angry.
|
||||
src.frustration += 5
|
||||
else
|
||||
next = path_target[1] //If it CAN path to the target, select the next move point
|
||||
path_target -= next
|
||||
step_towards(src,next) //And move in that direction.
|
||||
if (get_dist(src, src.target) >= distance) src.frustration++ //If it hasn't reached the target yet, get a little angry.
|
||||
else src.frustration-- //It reached the target! Get less angry.
|
||||
if(frustration >= patience) set_null() //If too angry? Fuck this shit.
|
||||
special_extra()
|
||||
if(target || flee_from.len)
|
||||
spawn(cycle_pause / 3)
|
||||
src.process()
|
||||
else
|
||||
spawn(cycle_pause)
|
||||
src.process()
|
||||
|
||||
proc/idle() //Idle proc for when it isn't in combat mode. Called by itself and process()
|
||||
set background = 1
|
||||
if(state != 2 || !alive || target) return //If you arne't idling, aren't alive, or have a target, you shouldn't be here.
|
||||
if(prob(5) && health < maxhealth) //5% chance of healing every cycle.
|
||||
health++
|
||||
special_extra()
|
||||
if(isnull(trg_idle)) //No one to follow? Find one.
|
||||
for(var/mob/living/O in viewers(world.view,src))
|
||||
if(O.mutations == (0 || CLOWN)) //Hates mutants and fatties.
|
||||
trg_idle = O
|
||||
break
|
||||
if(isnull(trg_idle)) //Still no one to follow? Step in a random direction.
|
||||
random_movement()
|
||||
else if(!path_idle.len) //Has a target but no path?
|
||||
if(can_see(src,trg_idle,view_range)) //Can see it? Then move towards it.
|
||||
step_towards(src,get_step_towards2(src , trg_idle))
|
||||
else
|
||||
path_idle(trg_idle) //Can't see it? Find a path.
|
||||
if(!path_idle.len) //Still no path? Stop trying to follow it.
|
||||
trg_idle = null
|
||||
random_movement()
|
||||
else
|
||||
if(can_see(src,trg_idle,view_range)) //Has a path and can see the target?
|
||||
if(get_dist(src, trg_idle) >= 2) //If 2 or more squares away, re-find path and move towards it.
|
||||
step_towards(src,get_step_towards2(src , trg_idle))
|
||||
if(path_idle.len) path_idle = new/list()
|
||||
else
|
||||
var/turf/next = path_idle[1] //Has a target and a path but can't see it?
|
||||
if(!next in range(1,src)) //If end of path and not next to target, find new path.
|
||||
path_idle(trg_idle)
|
||||
|
||||
if(path_idle.len) //If still some path left, move along path.
|
||||
next = path_idle[1]
|
||||
path_idle -= next
|
||||
step_towards(src,next)
|
||||
spawn(cycle_pause)
|
||||
idle()
|
||||
|
||||
proc/path_idle(var/atom/trg)
|
||||
path_idle = AStar(src.loc, get_turf(trg), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, anicard, null)
|
||||
path_idle = reverselist(path_idle)
|
||||
|
||||
proc/path_attack(var/atom/trg)
|
||||
path_target = AStar(src.loc, trg.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, anicard, null)
|
||||
path_target = reverselist(path_target)
|
||||
|
||||
proc/death(var/messy = 0)
|
||||
if(!alive) return
|
||||
alive = 0
|
||||
density = 0
|
||||
icon_state = "[species]_d"
|
||||
set_null()
|
||||
if(!messy)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\red <B>[src]'s eyes glass over!</B>", 1)
|
||||
else
|
||||
for (var/obj/item/I in src)
|
||||
if(!istype(I, /obj/item/weapon/card)) I.loc = src.loc
|
||||
del(src)
|
||||
|
||||
proc/healthcheck()
|
||||
if (src.health <= 0)
|
||||
src.death()
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////Specific Creature Entries////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*/obj/livestock/chick
|
||||
name = "Chick"
|
||||
desc = "A harmless little baby chicken, it's so cute!"
|
||||
icon_state = "chick"
|
||||
health = 10
|
||||
maxhealth = 10
|
||||
strength = 5
|
||||
cycle_pause = 15
|
||||
patience = 25
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/egg_holder
|
||||
special_extra()
|
||||
if(prob(5))
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O << "\green Chick: Cluck."
|
||||
src.egg_holder = new /obj/item/weapon/reagent_containers/food/snacks/egg(src)
|
||||
src.egg_holder.loc = src.loc
|
||||
src.egg_holder = null
|
||||
for(var/mob/living/carbon/human/V in viewers(world.view,src))
|
||||
if(V.mind.special_role == "wizard")
|
||||
for(var/mob/H in hearers(src, null))
|
||||
H << "\green Chick clucks in an angry manner at [V.name]."
|
||||
*/
|
||||
|
||||
/obj/livestock/spesscarp
|
||||
name = "Spess Carp"
|
||||
desc = "Oh shit, you're really fucked now."
|
||||
icon_state = "spesscarp"
|
||||
species = "spesscarp"
|
||||
aggressive = 1
|
||||
health = 25
|
||||
maxhealth = 25
|
||||
strength = 10
|
||||
cycle_pause = 10
|
||||
patience = 25
|
||||
view_range = 8
|
||||
var/stun_chance = 5 // determines the prob of a stun
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
|
||||
special_attack()
|
||||
if (prob(stun_chance))
|
||||
target:stunned = max(target:stunned, (strength / 2))
|
||||
|
||||
/obj/livestock/spesscarp/elite
|
||||
desc = "Oh shit, you're really fucked now. It has an evil gleam in it's eye."
|
||||
health = 50
|
||||
maxhealth = 50
|
||||
view_range = 14
|
||||
stun_chance = 40
|
||||
intelligence = "Assistant"
|
||||
|
||||
/obj/livestock/killertomato
|
||||
name = "Killer Tomato"
|
||||
desc = "Oh shit, you're really fucked now."
|
||||
icon_state = "killertomato"
|
||||
species = "killertomato"
|
||||
cowardly = 1
|
||||
health = 75
|
||||
maxhealth = 75
|
||||
cycle_pause = 10
|
||||
patience = 10
|
||||
view_range = 14
|
||||
intelligence = "Captain"
|
||||
var/stun_chance = 10 // determines the prob of a stun
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
|
||||
|
||||
/obj/livestock/walkingmushroom
|
||||
name = "Walking Mushroom"
|
||||
desc = "A...huge...mushroom...with legs!?"
|
||||
icon_state = "walkingmushroom"
|
||||
species = "walkingmushroom"
|
||||
cowardly = 1
|
||||
health = 50
|
||||
maxhealth = 50
|
||||
strength = 0
|
||||
cycle_pause = 10
|
||||
patience = 25
|
||||
view_range = 8
|
||||
intelligence = "Captain"
|
||||
var/stun_chance = 0
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src)
|
||||
|
||||
/obj/livestock/lizard
|
||||
name = "Lizard"
|
||||
desc = "A cute tiny lizard."
|
||||
icon_state = "lizard"
|
||||
species = "lizard"
|
||||
cowardly = 1
|
||||
health = 10
|
||||
maxhealth = 10
|
||||
strength = 2
|
||||
cycle_pause = 10
|
||||
patience = 50
|
||||
view_range = 7
|
||||
|
||||
/obj/livestock/roach
|
||||
name = "Roach"
|
||||
desc = "A cute large roach."
|
||||
icon_state = "roach"
|
||||
species = "roach"
|
||||
aggressive = 1
|
||||
health = 15
|
||||
maxhealth = 15
|
||||
strength = 2
|
||||
cycle_pause = 10
|
||||
patience = 50
|
||||
view_range = 7
|
||||
|
||||
/obj/livestock/bear
|
||||
name = "ninja space bear"
|
||||
desc = "Its sight is unbearable to your eye."
|
||||
icon_state = "bear"
|
||||
species = "bear"
|
||||
aggressive = 1
|
||||
health = 100
|
||||
maxhealth = 100
|
||||
cycle_pause = 15
|
||||
patience = 75
|
||||
strength = 30
|
||||
intelligence = "Captain"
|
||||
|
||||
var/adaptationChance = 10 //the chance per tick the bear will change its camouflage
|
||||
var/camouflage = "space" //"", "space" or "floor"
|
||||
|
||||
New()
|
||||
..()
|
||||
//new /obj/item/clothing/suit/bearpelt(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/bearmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/bearmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/bearmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/bearmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/bearmeat(src)
|
||||
//new /obj/item/weapon/reagent_containers/food/snacks/bearinnards(src)
|
||||
|
||||
special_extra() //camouflage check
|
||||
if(prob(adaptationChance))
|
||||
if(istype(loc,/turf/simulated/floor))
|
||||
if(camouflage != "floor")
|
||||
camouflage = "floor"
|
||||
else if(istype(loc,/turf/space))
|
||||
if(camouflage != "space")
|
||||
camouflage = "space"
|
||||
else if(camouflage != "")
|
||||
camouflage = ""
|
||||
update_icon()
|
||||
|
||||
update_icon()
|
||||
icon_state = "[species][camouflage][alive?"":"_d"]"
|
||||
|
||||
/* Commented out because of Filthy Xeno-lovers.
|
||||
/obj/livestock/cow
|
||||
name = "Pigmy Cow"
|
||||
desc = "That's not my cow!"
|
||||
icon_state = "cow"
|
||||
health = 100
|
||||
maxhealth = 100
|
||||
strength = 20
|
||||
cycle_pause = 20
|
||||
patience = 50
|
||||
view_range = 10
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/monkeymeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/monkeymeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/monkeymeat(src)
|
||||
special_extra()
|
||||
if(prob(20))
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O << "\green Cow: Moo."
|
||||
src.reagents.add_reagent("milk", 1)
|
||||
if(src.reagents.get_reagent_amount("milk") >= 100)
|
||||
gib()
|
||||
|
||||
examine()
|
||||
..()
|
||||
switch(src.reagents.get_reagent_amount("milk"))
|
||||
if(0 to 10)
|
||||
usr << text("\red The cow looks content.")
|
||||
if(11 to 80)
|
||||
usr << text("\red The cow looks uncomfortable.")
|
||||
if(81 to INFINITY)
|
||||
usr << text("\red The cow looks as if it could burst at any minute!")
|
||||
*/
|
||||
65
code/game/objects/storage/lockbox.dm
Normal file
@@ -0,0 +1,65 @@
|
||||
/obj/item/weapon/storage/lockbox
|
||||
name = "Lockbox"
|
||||
desc = "A locked box."
|
||||
icon_state = "lockbox+l"
|
||||
item_state = "syringe_kit"
|
||||
w_class = 4
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
|
||||
storage_slots = 4
|
||||
req_access = list(access_armory)
|
||||
var
|
||||
locked = 1
|
||||
broken = 0
|
||||
icon_locked = "lockbox+l"
|
||||
icon_closed = "lockbox"
|
||||
icon_broken = "lockbox+b"
|
||||
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/card/id))
|
||||
if(src.broken)
|
||||
user << "\red It appears to be broken."
|
||||
return
|
||||
if(src.allowed(user))
|
||||
src.locked = !( src.locked )
|
||||
if(src.locked)
|
||||
src.icon_state = src.icon_locked
|
||||
user << "\red You lock the [src.name]!"
|
||||
return
|
||||
else
|
||||
src.icon_state = src.icon_closed
|
||||
user << "\red You unlock the [src.name]!"
|
||||
return
|
||||
else
|
||||
user << "\red Access Denied"
|
||||
else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
|
||||
broken = 1
|
||||
locked = 0
|
||||
desc = "It appears to be broken."
|
||||
icon_state = src.icon_broken
|
||||
if(istype(W, /obj/item/weapon/melee/energy/blade))
|
||||
var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(src.loc, 'blade1.ogg', 50, 1)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
|
||||
else
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("\blue The locker has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2)
|
||||
|
||||
if(!locked)
|
||||
..()
|
||||
else
|
||||
user << "\red Its locked!"
|
||||
return
|
||||
|
||||
|
||||
show_to(mob/user as mob)
|
||||
if(locked)
|
||||
user << "\red Its locked!"
|
||||
else
|
||||
..()
|
||||
return
|
||||
@@ -1,3 +1,15 @@
|
||||
/obj/item/weapon/storage
|
||||
icon = 'storage.dmi'
|
||||
name = "storage"
|
||||
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
|
||||
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
|
||||
var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set)
|
||||
var/max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
|
||||
var/storage_slots = 7 //The number of storage slots in this container.
|
||||
var/obj/screen/storage/boxes = null
|
||||
var/obj/screen/close/closer = null
|
||||
w_class = 3.0
|
||||
|
||||
/obj/item/weapon/storage/proc/return_inv()
|
||||
|
||||
var/list/L = list( )
|
||||
@@ -200,14 +212,14 @@
|
||||
src.master.attackby(W, user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/survival_kit/New()
|
||||
/obj/item/weapon/storage/box/New()
|
||||
sleep(1)
|
||||
new /obj/item/clothing/mask/breath( src )
|
||||
new /obj/item/weapon/tank/emergency_oxygen( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/survival_kit/engineer/New()
|
||||
/obj/item/weapon/storage/box/engineer/New()
|
||||
..()
|
||||
contents = list()
|
||||
sleep(1)
|
||||
|
||||
@@ -1466,6 +1466,6 @@ turf/simulated/floor/return_siding_icon_state()
|
||||
for(var/obj/alien/facehugger/M in src)//These really need to be mobs.
|
||||
spawn(0)
|
||||
M.death()
|
||||
for(var/obj/livestock/M in src)
|
||||
for(var/obj/critter/M in src)
|
||||
spawn(0)
|
||||
M.gib()
|
||||
M.Die()
|
||||
@@ -650,7 +650,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_if_possible(new /obj/item/weapon/spellbook(M), M.slot_r_hand)
|
||||
M.equip_if_possible(new /obj/item/weapon/staff(M), M.slot_l_hand)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/backpack(M), M.slot_back)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/survival_kit(M), M.slot_in_backpack)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/box(M), M.slot_in_backpack)
|
||||
|
||||
if("red wizard")
|
||||
M.equip_if_possible(new /obj/item/clothing/under/lightpurple(M), M.slot_w_uniform)
|
||||
@@ -662,7 +662,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_if_possible(new /obj/item/weapon/spellbook(M), M.slot_r_hand)
|
||||
M.equip_if_possible(new /obj/item/weapon/staff(M), M.slot_l_hand)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/backpack(M), M.slot_back)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/survival_kit(M), M.slot_in_backpack)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/box(M), M.slot_in_backpack)
|
||||
|
||||
if("marisa wizard")
|
||||
M.equip_if_possible(new /obj/item/clothing/under/lightpurple(M), M.slot_w_uniform)
|
||||
@@ -674,7 +674,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_if_possible(new /obj/item/weapon/spellbook(M), M.slot_r_hand)
|
||||
M.equip_if_possible(new /obj/item/weapon/staff(M), M.slot_l_hand)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/backpack(M), M.slot_back)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/survival_kit(M), M.slot_in_backpack)
|
||||
M.equip_if_possible(new /obj/item/weapon/storage/box(M), M.slot_in_backpack)
|
||||
|
||||
M.update_clothing()
|
||||
return
|
||||
|
||||
@@ -158,7 +158,7 @@ var/global/sent_strike_team = 0
|
||||
equip_if_possible(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
|
||||
equip_if_possible(new /obj/item/weapon/storage/backpack/security(src), slot_back)
|
||||
equip_if_possible(new /obj/item/weapon/storage/survival_kit(src), slot_in_backpack)
|
||||
equip_if_possible(new /obj/item/weapon/storage/box(src), slot_in_backpack)
|
||||
|
||||
equip_if_possible(new /obj/item/ammo_magazine(src), slot_in_backpack)
|
||||
equip_if_possible(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
|
||||
|
||||
@@ -161,7 +161,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
equip_if_possible(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
|
||||
equip_if_possible(new /obj/item/weapon/storage/backpack/security(src), slot_back)
|
||||
equip_if_possible(new /obj/item/weapon/storage/survival_kit(src), slot_in_backpack)
|
||||
equip_if_possible(new /obj/item/weapon/storage/box(src), slot_in_backpack)
|
||||
|
||||
equip_if_possible(new /obj/item/ammo_magazine/c45(src), slot_in_backpack)
|
||||
equip_if_possible(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
|
||||
|
||||
117
code/modules/critters/adefine.dm
Normal file
@@ -0,0 +1,117 @@
|
||||
/obj/critter
|
||||
name = "Critter"
|
||||
desc = "Generic critter."
|
||||
icon = 'critter.dmi'
|
||||
icon_state = "basic"
|
||||
layer = 5.0
|
||||
density = 1
|
||||
anchored = 0
|
||||
var
|
||||
alive = 1
|
||||
health = 10
|
||||
max_health = 10
|
||||
|
||||
//AI things
|
||||
task = "thinking"
|
||||
//Attacks at will
|
||||
aggressive = 1
|
||||
//Will target an attacker
|
||||
defensive = 0
|
||||
//Will randomly move about
|
||||
wanderer = 1
|
||||
//Will open doors it bumps
|
||||
opensdoors = 1
|
||||
|
||||
//Internal tracking ignore
|
||||
frustration = 0
|
||||
max_frustration = 8
|
||||
attack = 0
|
||||
attacking = 0
|
||||
steps = 0
|
||||
last_found = null
|
||||
target = null
|
||||
oldtarget_name = null
|
||||
target_lastloc = null
|
||||
//The last guy who attacked it
|
||||
attacker = null
|
||||
//Will not attack this thing
|
||||
friend = null
|
||||
//How far to look for things dont set this overly high
|
||||
seekrange = 7
|
||||
|
||||
//If true will attack these things
|
||||
atkcarbon = 1
|
||||
atksilicon = 0
|
||||
atkcritter = 0
|
||||
//Attacks critters of the same type
|
||||
atksame = 0
|
||||
atkmech = 0
|
||||
|
||||
//Damage multipliers
|
||||
brutevuln = 1
|
||||
firevuln = 1
|
||||
//DR
|
||||
armor = 0
|
||||
|
||||
//How much damage it does it melee
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 2
|
||||
//Basic attack message when they move to attack and attack
|
||||
angertext = "charges at"
|
||||
attacktext = "attacks"
|
||||
|
||||
|
||||
proc
|
||||
patrol_step()
|
||||
process()
|
||||
seek_target()
|
||||
Die()
|
||||
ChaseAttack()
|
||||
RunAttack()
|
||||
TakeDamage(var/damage = 0)
|
||||
Target_Attacker(var/target)
|
||||
|
||||
|
||||
|
||||
/* TODO:Go over these and see how/if to add them
|
||||
|
||||
proc/set_attack()
|
||||
state = 1
|
||||
if(path_idle.len) path_idle = new/list()
|
||||
trg_idle = null
|
||||
|
||||
proc/set_idle()
|
||||
state = 2
|
||||
if (path_target.len) path_target = new/list()
|
||||
target = null
|
||||
frustration = 0
|
||||
|
||||
proc/set_null()
|
||||
state = 0
|
||||
if (path_target.len) path_target = new/list()
|
||||
if (path_idle.len) path_idle = new/list()
|
||||
target = null
|
||||
trg_idle = null
|
||||
frustration = 0
|
||||
|
||||
proc/path_idle(var/atom/trg)
|
||||
path_idle = AStar(src.loc, get_turf(trg), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, anicard, null)
|
||||
path_idle = reverselist(path_idle)
|
||||
|
||||
proc/path_attack(var/atom/trg)
|
||||
path_target = AStar(src.loc, trg.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, anicard, null)
|
||||
path_target = reverselist(path_target)
|
||||
|
||||
|
||||
//Look these over
|
||||
var/list/path = new/list()
|
||||
var/patience = 35 //The maximum time it'll chase a target.
|
||||
var/list/mob/living/carbon/flee_from = new/list()
|
||||
var/list/path_target = new/list() //The path to the combat target.
|
||||
|
||||
var/turf/trg_idle //It's idle target, the one it's following but not attacking.
|
||||
var/list/path_idle = new/list() //The path to the idle target.
|
||||
|
||||
|
||||
|
||||
*/
|
||||
186
code/modules/critters/critterAI.dm
Normal file
@@ -0,0 +1,186 @@
|
||||
|
||||
/obj/critter
|
||||
|
||||
New()
|
||||
spawn(0) process()//I really dont like this much but it seems to work well
|
||||
..()
|
||||
|
||||
|
||||
process()
|
||||
set background = 1
|
||||
if (!src.alive) return
|
||||
switch(task)
|
||||
if("thinking")
|
||||
src.attack = 0
|
||||
src.target = null
|
||||
sleep(15)
|
||||
walk_to(src,0)
|
||||
if (src.aggressive) seek_target()
|
||||
if (src.wanderer && !src.target) src.task = "wandering"
|
||||
if("chasing")
|
||||
if (src.frustration >= max_frustration)
|
||||
src.target = null
|
||||
src.last_found = world.time
|
||||
src.frustration = 0
|
||||
src.task = "thinking"
|
||||
walk_to(src,0)
|
||||
if (target)
|
||||
if (get_dist(src, src.target) <= 1)
|
||||
var/mob/living/carbon/M = src.target
|
||||
ChaseAttack()
|
||||
src.task = "attacking"
|
||||
src.anchored = 1
|
||||
src.target_lastloc = M.loc
|
||||
else
|
||||
var/turf/olddist = get_dist(src, src.target)
|
||||
walk_to(src, src.target,1,4)
|
||||
if ((get_dist(src, src.target)) >= (olddist))
|
||||
src.frustration++
|
||||
else
|
||||
src.frustration = 0
|
||||
sleep(5)
|
||||
else src.task = "thinking"
|
||||
if("attacking")
|
||||
// see if he got away
|
||||
if ((get_dist(src, src.target) > 1) || ((src.target:loc != src.target_lastloc)))
|
||||
src.anchored = 0
|
||||
src.task = "chasing"
|
||||
else
|
||||
if (get_dist(src, src.target) <= 1)
|
||||
var/mob/living/carbon/M = src.target
|
||||
if(!src.attacking) RunAttack()
|
||||
if(!src.aggressive)
|
||||
src.task = "thinking"
|
||||
src.target = null
|
||||
src.anchored = 0
|
||||
src.last_found = world.time
|
||||
src.frustration = 0
|
||||
src.attacking = 0
|
||||
else
|
||||
if(M!=null)
|
||||
if(M.health < 0)
|
||||
src.task = "thinking"
|
||||
src.target = null
|
||||
src.anchored = 0
|
||||
src.last_found = world.time
|
||||
src.frustration = 0
|
||||
src.attacking = 0
|
||||
else
|
||||
src.anchored = 0
|
||||
src.attacking = 0
|
||||
src.task = "chasing"
|
||||
if("wandering")
|
||||
patrol_step()
|
||||
sleep(10)
|
||||
spawn(8)
|
||||
process()
|
||||
return
|
||||
|
||||
|
||||
patrol_step()
|
||||
var/moveto = locate(src.x + rand(-1,1),src.y + rand(-1, 1),src.z)
|
||||
if (istype(moveto, /turf/simulated/floor) || istype(moveto, /turf/simulated/shuttle/floor) || istype(moveto, /turf/unsimulated/floor)) step_towards(src, moveto)
|
||||
if(src.aggressive) seek_target()
|
||||
steps += 1
|
||||
if (steps == rand(5,20)) src.task = "thinking"
|
||||
|
||||
|
||||
Bump(M as mob|obj)//TODO: Add access levels here
|
||||
spawn(0)
|
||||
if ((istype(M, /obj/machinery/door)))
|
||||
var/obj/machinery/door/D = M
|
||||
if (src.opensdoors)
|
||||
D.open()
|
||||
src.frustration = 0
|
||||
else src.frustration ++
|
||||
else if ((istype(M, /mob/living/)) && (!src.anchored))
|
||||
src.loc = M:loc
|
||||
src.frustration = 0
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
Bumped(M as mob|obj)
|
||||
spawn(0)
|
||||
var/turf/T = get_turf(src)
|
||||
M:loc = T
|
||||
|
||||
|
||||
seek_target()
|
||||
src.anchored = 0
|
||||
var/T = null
|
||||
for(var/mob/living/C in view(src.seekrange,src))//TODO: mess with this
|
||||
if (src.target)
|
||||
src.task = "chasing"
|
||||
break
|
||||
if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
|
||||
if(istype(C, /mob/living/carbon/) && !src.atkcarbon) continue
|
||||
if(istype(C, /mob/living/silicon/) && !src.atksilicon) continue
|
||||
if(C.health < 0) continue
|
||||
if(istype(C, /mob/living/carbon/) && src.atkcarbon) src.attack = 1
|
||||
if(istype(C, /mob/living/silicon/) && src.atksilicon) src.attack = 1
|
||||
if(src.attack)
|
||||
T = C
|
||||
break
|
||||
|
||||
if(!src.attack)
|
||||
for(var/obj/critter/C in view(src.seekrange,src))
|
||||
if(istype(C, /obj/critter) && !src.atkcritter) continue
|
||||
if(istype(C, /obj/mecha) && !src.atkmech) continue
|
||||
if(C.health < 0) continue
|
||||
if(istype(C, /obj/critter) && src.atkcritter)
|
||||
if(istype(C, src.type) && !src.atksame) continue
|
||||
src.attack = 1
|
||||
if(istype(C, /obj/mecha) && src.atkmech) src.attack = 1
|
||||
if(src.attack)
|
||||
T = C
|
||||
break
|
||||
|
||||
if(src.attack)
|
||||
src.target = T
|
||||
src.oldtarget_name = T:name
|
||||
src.task = "chasing"
|
||||
return
|
||||
|
||||
|
||||
ChaseAttack()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src]</B> [src.angertext] at [src.target]!", 1)
|
||||
return
|
||||
|
||||
|
||||
RunAttack()
|
||||
src.attacking = 1
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src]</B> [src.attacktext] [src.target]!", 1)
|
||||
if(ismob(src.target))
|
||||
src.target:bruteloss += rand(melee_damage_lower,melee_damage_upper)
|
||||
if(isobj(src.target))
|
||||
if(istype(target, /obj/mecha))
|
||||
src.target:take_damage(rand(melee_damage_lower,melee_damage_upper))
|
||||
else
|
||||
src.target:TakeDamage(rand(melee_damage_lower,melee_damage_upper))
|
||||
spawn(25)
|
||||
src.attacking = 0
|
||||
return
|
||||
|
||||
|
||||
|
||||
/*TODO: Figure out how to handle special things like this dont really want to give it to every critter
|
||||
/obj/critter/proc/CritterTeleport(var/telerange, var/dospark, var/dosmoke)
|
||||
if (!src.alive) return
|
||||
var/list/randomturfs = new/list()
|
||||
for(var/turf/T in orange(src, telerange))
|
||||
if(istype(T, /turf/space) || T.density) continue
|
||||
randomturfs.Add(T)
|
||||
src.loc = pick(randomturfs)
|
||||
if (dospark)
|
||||
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if (dosmoke)
|
||||
var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread()
|
||||
smoke.set_up(10, 0, src.loc)
|
||||
smoke.start()
|
||||
src.task = "thinking"
|
||||
*/
|
||||
166
code/modules/critters/critters.dm
Normal file
@@ -0,0 +1,166 @@
|
||||
/obj/critter/creature
|
||||
name = "creature"
|
||||
desc = "A sanity-destroying otherthing."
|
||||
icon = 'otherthing.dmi'
|
||||
icon_state = "otherthing"
|
||||
health = 80
|
||||
max_health = 80
|
||||
aggressive = 1
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
opensdoors = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 1
|
||||
atkcritter = 1
|
||||
atkmech = 1
|
||||
atksame = 1
|
||||
firevuln = 1
|
||||
brutevuln = 1
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 50
|
||||
angertext = "runs at"
|
||||
attacktext = "chomps"
|
||||
|
||||
|
||||
/obj/critter/roach
|
||||
name = "cockroach"
|
||||
desc = "An unpleasant insect that lives in filthy places."
|
||||
icon_state = "roach"
|
||||
health = 5
|
||||
max_health = 5
|
||||
aggressive = 0
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
opensdoors = 0
|
||||
atkcarbon = 1
|
||||
atksilicon = 0
|
||||
attacktext = "bites"
|
||||
|
||||
Die()
|
||||
..()
|
||||
del(src)
|
||||
|
||||
/obj/critter/killertomato
|
||||
name = "killer tomato"
|
||||
desc = "Oh shit, you're really fucked now."
|
||||
icon_state = "killertomato"
|
||||
health = 15
|
||||
max_health = 15
|
||||
aggressive = 1
|
||||
defensive = 0
|
||||
wanderer = 1
|
||||
opensdoors = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 1
|
||||
firevuln = 2
|
||||
brutevuln = 2
|
||||
|
||||
Die()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/tomatomeat(src)
|
||||
|
||||
|
||||
/obj/critter/spore
|
||||
name = "plasma spore"
|
||||
desc = "A barely intelligent colony of organisms. Very volatile."
|
||||
icon_state = "spore"
|
||||
density = 1
|
||||
health = 1
|
||||
max_health = 1
|
||||
aggressive = 0
|
||||
defensive = 0
|
||||
wanderer = 1
|
||||
opensdoors = 0
|
||||
atkcarbon = 0
|
||||
atksilicon = 0
|
||||
firevuln = 2
|
||||
brutevuln = 2
|
||||
|
||||
Die()
|
||||
src.visible_message("<b>[src]</b> ruptures and explodes!")
|
||||
src.alive = 0
|
||||
var/turf/T = get_turf(src.loc)
|
||||
if(T)
|
||||
T.hotspot_expose(700,125)
|
||||
explosion(T, -1, -1, 2, 3)
|
||||
del src
|
||||
|
||||
ex_act(severity)
|
||||
src.Die()
|
||||
|
||||
|
||||
/obj/critter/spesscarp
|
||||
name = "Spess Carp"
|
||||
desc = "Oh shit, you're really fucked now."
|
||||
icon_state = "spesscarp"
|
||||
health = 25
|
||||
max_health = 25
|
||||
aggressive = 1
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
opensdoors = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 1
|
||||
atkcritter = 1
|
||||
atkmech = 1
|
||||
firevuln = 2
|
||||
brutevuln = 1
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
angertext = "swims at"
|
||||
attacktext = "bites"
|
||||
|
||||
Die()
|
||||
..()
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
|
||||
|
||||
|
||||
/obj/critter/spesscarp/elite
|
||||
desc = "Oh shit, you're really fucked now. It has an evil gleam in it's eye."
|
||||
health = 50
|
||||
max_health = 50
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
|
||||
/obj/critter/walkingmushroom
|
||||
name = "Walking Mushroom"
|
||||
desc = "A...huge...mushroom...with legs!?"
|
||||
icon_state = "walkingmushroom"
|
||||
health = 15
|
||||
max_health = 15
|
||||
aggressive = 0
|
||||
defensive = 0
|
||||
wanderer = 1
|
||||
opensdoors = 0
|
||||
atkcarbon = 0
|
||||
atksilicon = 0
|
||||
firevuln = 2
|
||||
brutevuln = 1
|
||||
|
||||
Die()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
|
||||
|
||||
|
||||
/obj/critter/lizard
|
||||
name = "Lizard"
|
||||
desc = "A cute tiny lizard."
|
||||
icon_state = "lizard"
|
||||
health = 5
|
||||
max_health = 5
|
||||
aggressive = 0
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
opensdoors = 0
|
||||
atkcarbon = 1
|
||||
atksilicon = 1
|
||||
attacktext = "bites"
|
||||
95
code/modules/critters/defenses.dm
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
Contains the procs that control attacking critters
|
||||
*/
|
||||
/obj/critter
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/living/user as mob)
|
||||
..()
|
||||
if (!src.alive) return
|
||||
var/damage = 0
|
||||
switch(W.damtype)
|
||||
if("fire") damage = W.force * firevuln
|
||||
if("brute") damage = W.force * brutevuln
|
||||
TakeDamage(damage)
|
||||
if(src.defensive) Target_Attacker(user)
|
||||
return
|
||||
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
if (!src.alive) ..()
|
||||
if (user.a_intent == "hurt")
|
||||
TakeDamage(rand(1,2) * brutevuln)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <b>[user]</b> punches [src]!", 1)
|
||||
playsound(src.loc, pick('punch1.ogg','punch2.ogg','punch3.ogg','punch4.ogg'), 100, 1)
|
||||
if(src.defensive) Target_Attacker(user)
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <b>[user]</b> touches [src]!", 1)
|
||||
|
||||
|
||||
Target_Attacker(var/target)
|
||||
if(!target) return
|
||||
src.target = target
|
||||
src.oldtarget_name = target:name
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <b>[src]</b> [src.angertext] [target:name]!", 1)
|
||||
src.task = "chasing"
|
||||
return
|
||||
|
||||
|
||||
TakeDamage(var/damage = 0)
|
||||
var/tempdamage = (damage-armor)
|
||||
if(tempdamage > 0)
|
||||
src.health -= tempdamage
|
||||
else
|
||||
src.health--
|
||||
if(src.health <= 0)
|
||||
src.Die()
|
||||
|
||||
|
||||
Die()//Might be more effective to del them and create a dummy item of some sorts
|
||||
if (!src.alive) return
|
||||
src.icon_state += "-dead"
|
||||
src.alive = 0
|
||||
src.anchored = 0
|
||||
src.density = 0
|
||||
walk_to(src,0)
|
||||
src.visible_message("<b>[src]</b> dies!")
|
||||
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
TakeDamage(Proj.damage)
|
||||
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.Die()
|
||||
return
|
||||
if(2.0)
|
||||
TakeDamage(20)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
emp_act(serverity)
|
||||
switch(serverity)
|
||||
if(1.0)
|
||||
src.Die()
|
||||
return
|
||||
if(2.0)
|
||||
TakeDamage(20)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
meteorhit()
|
||||
src.Die()
|
||||
return
|
||||
|
||||
|
||||
blob_act()
|
||||
if(prob(25))
|
||||
src.Die()
|
||||
return
|
||||
244
code/modules/critters/hivebots/hivebot.dm
Normal file
@@ -0,0 +1,244 @@
|
||||
/obj/item/projectile/hivebotbullet
|
||||
damage = 5
|
||||
mobdamage = list(BRUTE = 5, BURN = 0, TOX = 0, OXY = 0, CLONE = 0)
|
||||
|
||||
/obj/critter/hivebot
|
||||
name = "Hivebot"
|
||||
desc = "A small robot"
|
||||
icon = 'hivebot.dmi'
|
||||
icon_state = "basic"
|
||||
health = 10
|
||||
max_health = 10
|
||||
aggressive = 1
|
||||
wanderer = 1
|
||||
opensdoors = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 0
|
||||
atkcritter = 1
|
||||
atksame = 0
|
||||
atkmech = 1
|
||||
firevuln = 0.5
|
||||
brutevuln = 1
|
||||
seekrange = 8
|
||||
armor = 5
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 3
|
||||
angertext = "leaps at"
|
||||
attacktext = "claws"
|
||||
var
|
||||
ranged = 0
|
||||
rapid = 0
|
||||
proc
|
||||
Shoot(var/target, var/start, var/user, var/bullet = 0)
|
||||
OpenFire(var/thing)//bluh ill rename this later or somethin
|
||||
|
||||
|
||||
Die()
|
||||
if (!src.alive) return
|
||||
src.alive = 0
|
||||
walk_to(src,0)
|
||||
src.visible_message("<b>[src]</b> blows apart!")
|
||||
var/turf/Ts = get_turf(src)
|
||||
new /obj/decal/cleanable/robot_debris(Ts)
|
||||
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
del(src)
|
||||
|
||||
seek_target()
|
||||
src.anchored = 0
|
||||
var/T = null
|
||||
for(var/mob/living/C in view(src.seekrange,src))//TODO: mess with this
|
||||
if (src.target)
|
||||
src.task = "chasing"
|
||||
break
|
||||
if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
|
||||
if(istype(C, /mob/living/carbon/) && !src.atkcarbon) continue
|
||||
if(istype(C, /mob/living/silicon/) && !src.atksilicon) continue
|
||||
if(C.health < 0) continue
|
||||
if(istype(C, /mob/living/carbon/) && src.atkcarbon)
|
||||
if(C:mind)
|
||||
if(C:mind:special_role == "H.I.V.E")
|
||||
continue
|
||||
src.attack = 1
|
||||
if(istype(C, /mob/living/silicon/) && src.atksilicon)
|
||||
if(C:mind)
|
||||
if(C:mind:special_role == "H.I.V.E")
|
||||
continue
|
||||
src.attack = 1
|
||||
if(src.attack)
|
||||
T = C
|
||||
break
|
||||
|
||||
if(!src.attack)
|
||||
for(var/obj/critter/C in view(src.seekrange,src))
|
||||
if(istype(C, /obj/critter) && !src.atkcritter) continue
|
||||
if(istype(C, /obj/mecha) && !src.atkmech) continue
|
||||
if(C.health < 0) continue
|
||||
if(istype(C, /obj/critter) && src.atkcritter)
|
||||
if(istype(C, /obj/critter/hivebot) && !src.atksame) continue
|
||||
src.attack = 1
|
||||
if(istype(C, /obj/mecha) && src.atkmech) src.attack = 1
|
||||
if(src.attack)
|
||||
T = C
|
||||
break
|
||||
|
||||
if(src.attack)
|
||||
src.target = T
|
||||
src.oldtarget_name = T:name
|
||||
if(src.ranged)
|
||||
OpenFire(T)
|
||||
return
|
||||
src.task = "chasing"
|
||||
return
|
||||
|
||||
|
||||
OpenFire(var/thing)
|
||||
src.target = thing
|
||||
src.oldtarget_name = thing:name
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <b>[src]</b> fires at [src.target]!", 1)
|
||||
|
||||
var/tturf = get_turf(target)
|
||||
if(rapid)
|
||||
spawn(1)
|
||||
Shoot(tturf, src.loc, src)
|
||||
spawn(4)
|
||||
Shoot(tturf, src.loc, src)
|
||||
spawn(6)
|
||||
Shoot(tturf, src.loc, src)
|
||||
else
|
||||
Shoot(tturf, src.loc, src)
|
||||
|
||||
src.attack = 0
|
||||
sleep(12)
|
||||
seek_target()
|
||||
src.task = "thinking"
|
||||
return
|
||||
|
||||
|
||||
Shoot(var/target, var/start, var/user, var/bullet = 0)
|
||||
if(target == start)
|
||||
return
|
||||
|
||||
var/obj/item/projectile/hivebotbullet/A = new /obj/item/projectile/hivebotbullet(user:loc)
|
||||
playsound(user, 'Gunshot.ogg', 100, 1)
|
||||
|
||||
if(!A) return
|
||||
|
||||
if (!istype(target, /turf))
|
||||
del(A)
|
||||
return
|
||||
A.current = target
|
||||
A.yo = target:y - start:y
|
||||
A.xo = target:x - start:x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/critter/hivebot/range
|
||||
name = "Hivebot"
|
||||
desc = "A smallish robot, this one is armed!"
|
||||
ranged = 1
|
||||
|
||||
/obj/critter/hivebot/rapid
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
|
||||
/obj/critter/hivebot/strong
|
||||
name = "Strong Hivebot"
|
||||
desc = "A robot, this one is armed and looks tough!"
|
||||
health = 50
|
||||
armor = 10
|
||||
ranged = 1
|
||||
|
||||
/obj/critter/hivebot/borg
|
||||
health = 20
|
||||
atksilicon = 1
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
|
||||
|
||||
|
||||
/obj/critter/hivebot/tele//this still needs work
|
||||
name = "Beacon"
|
||||
desc = "Some odd beacon thing"
|
||||
icon = 'Hivebot.dmi'
|
||||
icon_state = "def_radar-off"
|
||||
health = 100
|
||||
max_health = 100
|
||||
aggressive = 0
|
||||
wanderer = 0
|
||||
opensdoors = 0
|
||||
atkcarbon = 0
|
||||
atksilicon = 0
|
||||
atkcritter = 0
|
||||
atksame = 0
|
||||
atkmech = 0
|
||||
firevuln = 0.5
|
||||
brutevuln = 1
|
||||
seekrange = 2
|
||||
armor = 10
|
||||
|
||||
var
|
||||
bot_type = "norm"
|
||||
bot_amt = 10
|
||||
spawn_delay = 600
|
||||
turn_on = 0
|
||||
auto_spawn = 1
|
||||
proc
|
||||
warpbots()
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread()
|
||||
smoke.set_up(5, 0, src.loc)
|
||||
smoke.start()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>The [src] warps in!</B>", 1)
|
||||
playsound(src.loc, 'EMPulse.ogg', 25, 1)
|
||||
if(auto_spawn)
|
||||
spawn(spawn_delay)
|
||||
turn_on = 1
|
||||
|
||||
|
||||
warpbots()
|
||||
icon_state = "def_radar"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red The [src] turns on!", 1)
|
||||
while(bot_amt > 0)
|
||||
bot_amt--
|
||||
switch(bot_type)
|
||||
if("norm")
|
||||
new /obj/critter/hivebot(get_turf(src))
|
||||
if("range")
|
||||
new /obj/critter/hivebot/range(get_turf(src))
|
||||
if("rapid")
|
||||
new /obj/critter/hivebot/rapid(get_turf(src))
|
||||
spawn(100)
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
process()
|
||||
if(health < (max_health/2))
|
||||
turn_on = 1
|
||||
if(turn_on)
|
||||
warpbots()
|
||||
turn_on = 0
|
||||
..()
|
||||
|
||||
/obj/critter/hivebot/tele/massive
|
||||
bot_type = "norm"
|
||||
bot_amt = 30
|
||||
auto_spawn = 0
|
||||
|
||||
/obj/critter/hivebot/tele/ranged
|
||||
bot_type = "range"
|
||||
|
||||
/obj/critter/hivebot/tele/rapid
|
||||
bot_type = "rapid"
|
||||
spawn_delay = 800
|
||||
@@ -50,6 +50,7 @@ datum
|
||||
build_type = null //Flag as to what kind machine the design is built in. See defines.
|
||||
list/materials = list() //List of materials. Format: "id" = amount.
|
||||
build_path = "" //The file path of the object that gets created
|
||||
locked = 0 //If true it will spawn inside a lockbox with currently sec access
|
||||
|
||||
proc
|
||||
//A proc to calculate the reliability of a design based on tech levels and innate modifiers.
|
||||
@@ -1000,6 +1001,7 @@ datum
|
||||
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 500)
|
||||
reliability_base = 76
|
||||
build_path = "/obj/item/weapon/gun/energy/nuclear"
|
||||
locked = 1
|
||||
|
||||
stunrevolver
|
||||
name = "Stun Revolver"
|
||||
@@ -1009,6 +1011,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 4000)
|
||||
build_path = "/obj/item/weapon/gun/energy/stunrevolver"
|
||||
locked = 1
|
||||
|
||||
lasercannon
|
||||
name = "Laser Cannon"
|
||||
@@ -1018,6 +1021,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 10000, "$glass" = 1000, "$diamond" = 2000)
|
||||
build_path = "/obj/item/weapon/gun/energy/lasercannon"
|
||||
locked = 1
|
||||
|
||||
shockgun
|
||||
name = "Shock Gun"
|
||||
@@ -1027,6 +1031,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 8000, "$silver" = 3000, "$gold" = 500)
|
||||
build_path = "/obj/item/weapon/gun/energy/shockgun"
|
||||
locked = 1
|
||||
|
||||
decloner
|
||||
name = "Decloner"
|
||||
@@ -1036,6 +1041,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40)
|
||||
build_path = "/obj/item/weapon/gun/energy/decloner"
|
||||
locked = 1
|
||||
|
||||
chemsprayer
|
||||
name = "Chem Sprayer"
|
||||
@@ -1073,6 +1079,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000)
|
||||
build_path = "/obj/item/weapon/gun/energy/freeze"
|
||||
locked = 1
|
||||
|
||||
large_grenade
|
||||
name = "Large Grenade"
|
||||
@@ -1092,6 +1099,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000)
|
||||
build_path = "/obj/item/weapon/gun/projectile/automatic"
|
||||
locked = 1
|
||||
|
||||
ammo_9mm
|
||||
name = "Ammunition Box (9mm)"
|
||||
@@ -1206,6 +1214,7 @@ datum
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 50, "$glass" = 50)
|
||||
build_path = "/obj/item/clothing/glasses/hud/security"
|
||||
locked = 1
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////////////Test///////////////////
|
||||
|
||||
@@ -370,6 +370,11 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
var/obj/new_item = new being_built.build_path(src)
|
||||
new_item.reliability = being_built.reliability
|
||||
if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0)
|
||||
if(being_built.locked)
|
||||
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
|
||||
new_item.loc = L
|
||||
L.name += " ([new_item.name])"
|
||||
else
|
||||
new_item.loc = linked_lathe.loc
|
||||
linked_lathe.busy = 0
|
||||
screen = 3.1
|
||||
|
||||
|
Before Width: | Height: | Size: 788 B After Width: | Height: | Size: 911 B |
BIN
icons/mob/critter.dmi
Normal file
|
After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
@@ -78,6 +78,8 @@
|
||||
#define FILE_DIR "code/modules/admin/verbs"
|
||||
#define FILE_DIR "code/modules/assembly"
|
||||
#define FILE_DIR "code/modules/chemical"
|
||||
#define FILE_DIR "code/modules/critters"
|
||||
#define FILE_DIR "code/modules/critters/hivebots"
|
||||
#define FILE_DIR "code/modules/food"
|
||||
#define FILE_DIR "code/modules/mining"
|
||||
#define FILE_DIR "code/modules/mob"
|
||||
@@ -493,7 +495,6 @@
|
||||
#include "code\game\objects\items.dm"
|
||||
#include "code\game\objects\kitchen.dm"
|
||||
#include "code\game\objects\lamarr.dm"
|
||||
#include "code\game\objects\livestock.dm"
|
||||
#include "code\game\objects\mineral_doors.dm"
|
||||
#include "code\game\objects\new_year.dm"
|
||||
#include "code\game\objects\noticeboard.dm"
|
||||
@@ -617,6 +618,7 @@
|
||||
#include "code\game\objects\storage\crates.dm"
|
||||
#include "code\game\objects\storage\firstaid.dm"
|
||||
#include "code\game\objects\storage\kit.dm"
|
||||
#include "code\game\objects\storage\lockbox.dm"
|
||||
#include "code\game\objects\storage\storage.dm"
|
||||
#include "code\game\objects\storage\toolbox.dm"
|
||||
#include "code\game\verbs\AI_status.dm"
|
||||
@@ -667,6 +669,11 @@
|
||||
#include "code\modules\chemical\Chemistry-Reagents.dm"
|
||||
#include "code\modules\chemical\Chemistry-Recipes.dm"
|
||||
#include "code\modules\chemical\Chemistry-Tools.dm"
|
||||
#include "code\modules\critters\adefine.dm"
|
||||
#include "code\modules\critters\critterAI.dm"
|
||||
#include "code\modules\critters\critters.dm"
|
||||
#include "code\modules\critters\defenses.dm"
|
||||
#include "code\modules\critters\hivebots\hivebot.dm"
|
||||
#include "code\modules\food\food.dm"
|
||||
#include "code\modules\food\recipes_microwave.dm"
|
||||
#include "code\modules\mining\datum_processing_recipe.dm"
|
||||
@@ -832,8 +839,6 @@
|
||||
#include "code\WorkInProgress\recycling\disposal-construction.dm"
|
||||
#include "code\WorkInProgress\recycling\disposal.dm"
|
||||
#include "code\WorkInProgress\recycling\sortingmachinery.dm"
|
||||
#include "code\WorkInProgress\thehive\mhivebot.dm"
|
||||
#include "code\WorkInProgress\thehive\transport.dm"
|
||||
#include "code\WorkInProgress\virus2\Prob.dm"
|
||||
#include "code\WorkInProgress\virus2\Disease2\analyser.dm"
|
||||
#include "code\WorkInProgress\virus2\Disease2\base.dm"
|
||||
|
||||