mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-04 14:33:10 +00:00
I'm currently working on moving all of the vars in mob_defines.dm and some procs in mob.dm into more fitting places. For example, ghosts and simple animals can not be cloned, so they do not need a cloneloss var. Cloneloss would be better fitting to /mob/living or even /mob/living/carbon. By moving these defines into proper children of /mob we lower the amount of resources that must be set aside every time a mob is created and we lower the amount of data that gets transfered between mobs when we combine, transfer or transform them. In theory, this should help free up some resources and combat lag. Due to how integrated some of these defines are in the rest of the code, I'm going to be committing this cleanup in small batches. Doing it this way instead of one massive commit means that bugs will be easier to locate and identify. It is also less likely to overwhelm players with bugs, and if it still does, it will make it easier for us to revert only the section that is causing problems. Smaller commits also means merging with existing code will be less of a nightmare and has less potential for merging mistakes. One of my goals in this cleanup is to add a description to every single variable in mob defines. While some of them are self explanatory, there are some there that are used in horribly obscure ways on top of having no comment to describe their use. ----------------------- Mob defines moved to living: - last_special* - bruteloss - oxyloss - toxloss - fireloss - cloneloss - brainloss - halloss - hallucination - hallucinations(list) *Note: I believe this variable is not needed, but the code it is used in (the resist verb) is cluttered and messy. That chunk of code probably use a re-write. I'll put it on my TODO list and if I survive mob_defines I'll try to get around to it but if anyone wants to do it for me, that would certainly help! ----------------------- Mob procs moved to living: - getBruteLoss() - adjustBruteLoss() - getOxyLoss() - adjustOxyLoss() - setOxyLoss() - getToxLoss() - adjustToxLoss() - setToxLoss() - getFireLoss() - adjustFireLoss() - getCloneLoss() - adjustCloneLoss() - setCloneLoss() - getHalLoss() - adjustHalLoss() - setHalLoss() - getBrainLoss() - adjustBrainLoss() - setBrainLoss Mob procs moved to carbon: getDNA() setDNA() ----------------------- Mob verbs moved to carbon: - Sleep - Lay down / Get up ----------------------- The : operator... The thing that has been killing me through this whole cleanup is people using or copy/pasting the : operator everywhere. *** Please use obj.var_or_procname. Do not use obj:var_or_procname *** Using obj:procname will not throw a compiler error if obj does not have that specific var or proc. This means that the coder making changes will NOT be informed of an error which will result in a proc failing, potentially being completely unusable and definatly causing a runtime error. With that said, I fully anticipate that most bugs (if any) caused by this mob define cleanup to be the result of : operators. I've been replacing many : operators in favour of the . operator as I've been going, most noteably I went out of my way to remove almost every : operator from the 4000+ line Chemistry-Regents.dm Exceptions: - Water: Turf and Atmos related vars. I'm not familiar with the members and methods in those class' hierarchy. - Silicate: because it's commented out and I honestly dont see it returning. - Thermite: Turf and Atmos related vars. - Corn Oil: Turf and Atmos related vars. Final note: While this may be the source of some mob-related bugs, there are two other revisions that have been committed between now and the last time either of the the two tgstation servers have been updated. These revisions both touch mob-related files. I'm not blaming these other revisions for anything, especially since one of them is mine anyway, I'm just listing them here for refrence to help quickly identify any problems. - My human/life() changes in r3925 - Carn's life() standardizations in r3933 Stuff unrelated to mob defines: - Fixed borgs and such being able to go into DNA modifiers. - Changelog updated and I added Sieve to the list of coders. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3934 316c924e-a436-60f5-8080-3fe189b3f50e
829 lines
21 KiB
Plaintext
829 lines
21 KiB
Plaintext
/mob/Del()//This makes sure that mobs with clients/keys are not just deleted from the game.
|
|
ghostize(1)
|
|
..()
|
|
|
|
/mob/proc/Cell()
|
|
set category = "Admin"
|
|
set hidden = 1
|
|
|
|
if(!loc) return 0
|
|
|
|
var/datum/gas_mixture/environment = loc.return_air()
|
|
|
|
var/t = "\blue Coordinates: [x],[y] \n"
|
|
t+= "\red Temperature: [environment.temperature] \n"
|
|
t+= "\blue Nitrogen: [environment.nitrogen] \n"
|
|
t+= "\blue Oxygen: [environment.oxygen] \n"
|
|
t+= "\blue Plasma : [environment.toxins] \n"
|
|
t+= "\blue Carbon Dioxide: [environment.carbon_dioxide] \n"
|
|
for(var/datum/gas/trace_gas in environment.trace_gases)
|
|
usr << "\blue [trace_gas.type]: [trace_gas.moles] \n"
|
|
|
|
usr.show_message(t, 1)
|
|
|
|
/atom/proc/relaymove()
|
|
return
|
|
|
|
/obj/effect/equip_e/process()
|
|
return
|
|
|
|
/obj/effect/equip_e/proc/done()
|
|
return
|
|
|
|
/obj/effect/equip_e/New()
|
|
if (!ticker)
|
|
del(src)
|
|
return
|
|
spawn(100)
|
|
del(src)
|
|
return
|
|
..()
|
|
return
|
|
|
|
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
|
|
if(!client) return
|
|
if (type)
|
|
if ((type & 1 && (sdisabilities & 1 || (blinded || paralysis))))//Vision related
|
|
if (!( alt ))
|
|
return
|
|
else
|
|
msg = alt
|
|
type = alt_type
|
|
if ((type & 2 && (sdisabilities & 4 || ear_deaf)))//Hearing related
|
|
if (!( alt ))
|
|
return
|
|
else
|
|
msg = alt
|
|
type = alt_type
|
|
if ((type & 1 && sdisabilities & 1))
|
|
return
|
|
// Added voice muffling for Issue 41.
|
|
if (stat == 1 || sleeping > 0)
|
|
src << "<I>... You can almost hear someone talking ...</I>"
|
|
else
|
|
src << msg
|
|
return
|
|
|
|
// Show a message to all mobs in sight of this one
|
|
// This would be for visible actions by the src mob
|
|
// message is the message output to anyone who can see e.g. "[src] does something!"
|
|
// self_message (optional) is what the src mob sees e.g. "You do something!"
|
|
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
|
|
|
/mob/visible_message(var/message, var/self_message, var/blind_message)
|
|
for(var/mob/M in viewers(src))
|
|
var/msg = message
|
|
if(self_message && M==src)
|
|
msg = self_message
|
|
M.show_message( msg, 1, blind_message, 2)
|
|
|
|
// Show a message to all mobs in sight of this atom
|
|
// Use for objects performing visible actions
|
|
// message is output to anyone who can see, e.g. "The [src] does something!"
|
|
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
|
/atom/proc/visible_message(var/message, var/blind_message)
|
|
for(var/mob/M in viewers(src))
|
|
M.show_message( message, 1, blind_message, 2)
|
|
|
|
|
|
/mob/proc/findname(msg)
|
|
for(var/mob/M in world)
|
|
if (M.real_name == text("[]", msg))
|
|
return M
|
|
return 0
|
|
|
|
/mob/proc/movement_delay()
|
|
return 0
|
|
|
|
/mob/proc/Life()
|
|
// if(organStructure)
|
|
// organStructure.ProcessOrgans()
|
|
return
|
|
|
|
|
|
/mob/proc/restrained()
|
|
if (handcuffed)
|
|
return 1
|
|
return
|
|
|
|
//Used by monkeys, *chimpers* //TODO: eliminate this convoluted proc it's incredibly shitty. ~Carn
|
|
/mob/proc/db_click(text, t1)
|
|
var/obj/item/weapon/W = get_active_hand()
|
|
switch(text)
|
|
if("mask")
|
|
if (wear_mask)
|
|
return
|
|
if (!( W.slot_flags & SLOT_MASK ))
|
|
return
|
|
u_equip(W)
|
|
wear_mask = W
|
|
W.equipped(src, text)
|
|
update_inv_wear_mask()
|
|
if("back")
|
|
if (back)
|
|
return
|
|
if (!istype(W, /obj/item))
|
|
return
|
|
if (!( W.slot_flags & SLOT_BACK ))
|
|
return
|
|
if(istype(W,/obj/item/weapon/twohanded) && W:wielded)
|
|
usr << "<span class='warning'>Unwield the [initial(W.name)] first!</span>"
|
|
return
|
|
u_equip(W)
|
|
back = W
|
|
W.equipped(src, text)
|
|
update_inv_back()
|
|
|
|
return
|
|
|
|
/mob/proc/reset_view(atom/A)
|
|
if (client)
|
|
if (istype(A, /atom/movable))
|
|
client.perspective = EYE_PERSPECTIVE
|
|
client.eye = A
|
|
else
|
|
if (isturf(loc))
|
|
client.eye = client.mob
|
|
client.perspective = MOB_PERSPECTIVE
|
|
else
|
|
client.perspective = EYE_PERSPECTIVE
|
|
client.eye = loc
|
|
return
|
|
|
|
|
|
/mob/proc/show_inv(mob/user as mob)
|
|
user.machine = src
|
|
var/dat = {"
|
|
<B><HR><FONT size=3>[name]</FONT></B>
|
|
<BR><HR>
|
|
<BR><B>Head(Mask):</B> <A href='?src=\ref[src];item=mask'>[(wear_mask ? wear_mask : "Nothing")]</A>
|
|
<BR><B>Left Hand:</B> <A href='?src=\ref[src];item=l_hand'>[(l_hand ? l_hand : "Nothing")]</A>
|
|
<BR><B>Right Hand:</B> <A href='?src=\ref[src];item=r_hand'>[(r_hand ? r_hand : "Nothing")]</A>
|
|
<BR><B>Back:</B> <A href='?src=\ref[src];item=back'>[(back ? back : "Nothing")]</A> [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" <A href='?src=\ref[];item=internal'>Set Internal</A>", src) : "")]
|
|
<BR>[(handcuffed ? text("<A href='?src=\ref[src];item=handcuff'>Handcuffed</A>") : text("<A href='?src=\ref[src];item=handcuff'>Not Handcuffed</A>"))]
|
|
<BR>[(internal ? text("<A href='?src=\ref[src];item=internal'>Remove Internal</A>") : "")]
|
|
<BR><A href='?src=\ref[src];item=pockets'>Empty Pockets</A>
|
|
<BR><A href='?src=\ref[user];refresh=1'>Refresh</A>
|
|
<BR><A href='?src=\ref[user];mach_close=mob[name]'>Close</A>
|
|
<BR>"}
|
|
user << browse(dat, text("window=mob[];size=325x500", name))
|
|
onclose(user, "mob[name]")
|
|
return
|
|
|
|
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
|
|
if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
|
|
if (!( L ))
|
|
return null
|
|
else
|
|
return L.container
|
|
else
|
|
if (!( L ))
|
|
L = new /obj/effect/list_container/mobl( null )
|
|
L.container += src
|
|
L.master = src
|
|
if (istype(l_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = l_hand
|
|
if (!( L.container.Find(G.affecting) ))
|
|
L.container += G.affecting
|
|
if (G.affecting)
|
|
G.affecting.ret_grab(L, 1)
|
|
if (istype(r_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = r_hand
|
|
if (!( L.container.Find(G.affecting) ))
|
|
L.container += G.affecting
|
|
if (G.affecting)
|
|
G.affecting.ret_grab(L, 1)
|
|
if (!( flag ))
|
|
if (L.master == src)
|
|
var/list/temp = list( )
|
|
temp += L.container
|
|
//L = null
|
|
del(L)
|
|
return temp
|
|
else
|
|
return L.container
|
|
return
|
|
|
|
/mob/verb/mode()
|
|
set name = "Activate Held Object"
|
|
set category = "IC"
|
|
set src = usr
|
|
|
|
if(hand)
|
|
var/obj/item/W = l_hand
|
|
if (W)
|
|
W.attack_self(src)
|
|
update_inv_l_hand()
|
|
else
|
|
var/obj/item/W = r_hand
|
|
if (W)
|
|
W.attack_self(src)
|
|
update_inv_r_hand()
|
|
return
|
|
|
|
/*
|
|
/mob/verb/dump_source()
|
|
|
|
var/master = "<PRE>"
|
|
for(var/t in typesof(/area))
|
|
master += text("[]\n", t)
|
|
//Foreach goto(26)
|
|
src << browse(master)
|
|
return
|
|
*/
|
|
|
|
/mob/verb/memory()
|
|
set name = "Notes"
|
|
set category = "OOC"
|
|
if(mind)
|
|
mind.show_memory(src)
|
|
else
|
|
src << "The game appears to have misplaced your mind datum, so we can't show you your notes."
|
|
|
|
/mob/verb/add_memory(msg as message)
|
|
set name = "Add Note"
|
|
set category = "OOC"
|
|
|
|
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
|
msg = sanitize(msg)
|
|
|
|
if(mind)
|
|
mind.store_memory(msg)
|
|
else
|
|
src << "The game appears to have misplaced your mind datum, so we can't show you your notes."
|
|
|
|
/mob/proc/store_memory(msg as message, popup, sane = 1)
|
|
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
|
|
|
if (sane)
|
|
msg = sanitize(msg)
|
|
|
|
if (length(memory) == 0)
|
|
memory += msg
|
|
else
|
|
memory += "<BR>[msg]"
|
|
|
|
if (popup)
|
|
memory()
|
|
|
|
/*
|
|
/mob/verb/help()
|
|
set name = "Help"
|
|
src << browse('help.html', "window=help")
|
|
return
|
|
*/
|
|
|
|
/mob/verb/abandon_mob()
|
|
set name = "Respawn"
|
|
set category = "OOC"
|
|
|
|
if (!( abandon_allowed ))
|
|
return
|
|
if ((stat != 2 || !( ticker )))
|
|
usr << "\blue <B>You must be dead to use this!</B>"
|
|
return
|
|
|
|
log_game("[usr.name]/[usr.key] used abandon mob.")
|
|
|
|
usr << "\blue <B>Please roleplay correctly!</B>"
|
|
|
|
if(!client)
|
|
log_game("[usr.key] AM failed due to disconnect.")
|
|
return
|
|
for(var/obj/screen/t in usr.client.screen)
|
|
if (t.loc == null)
|
|
//t = null
|
|
del(t)
|
|
if(!client)
|
|
log_game("[usr.key] AM failed due to disconnect.")
|
|
return
|
|
|
|
var/mob/new_player/M = new /mob/new_player()
|
|
if(!client)
|
|
log_game("[usr.key] AM failed due to disconnect.")
|
|
del(M)
|
|
return
|
|
|
|
|
|
|
|
if(client && client.holder && (client.holder.state == 2))
|
|
client.admin_play()
|
|
return
|
|
|
|
M.key = client.key
|
|
M.Login()
|
|
return
|
|
|
|
/mob/verb/changes()
|
|
set name = "Changelog"
|
|
set category = "OOC"
|
|
if (client)
|
|
src.getFiles('postcardsmall.jpg',
|
|
'somerights20.png',
|
|
'88x31.png',
|
|
'bug-minus.png',
|
|
'cross-circle.png',
|
|
'hard-hat-exclamation.png',
|
|
'image-minus.png',
|
|
'image-plus.png',
|
|
'music-minus.png',
|
|
'music-plus.png',
|
|
'tick-circle.png',
|
|
'wrench-screwdriver.png',
|
|
'spell-check.png',
|
|
'burn-exclamation.png',
|
|
'chevron.png',
|
|
'chevron-expand.png',
|
|
'changelog.css',
|
|
'changelog.js'
|
|
)
|
|
src << browse('changelog.html', "window=changes;size=675x650")
|
|
client.changes = 1
|
|
|
|
/client/var/ghost_ears = 1
|
|
/client/verb/toggle_ghost_ears()
|
|
set name = "Ghost ears"
|
|
set category = "OOC"
|
|
set desc = "Hear talks from everywhere"
|
|
ghost_ears = !ghost_ears
|
|
if (ghost_ears)
|
|
usr << "\blue Now you hear all speech in the world"
|
|
else
|
|
usr << "\blue Now you hear speech only from nearest creatures."
|
|
|
|
/client/var/ghost_sight = 1
|
|
/client/verb/toggle_ghost_sight()
|
|
set name = "Ghost sight"
|
|
set category = "OOC"
|
|
set desc = "Hear emotes from everywhere"
|
|
ghost_sight = !ghost_sight
|
|
if (ghost_sight)
|
|
usr << "\blue Now you hear all emotes in the world"
|
|
else
|
|
usr << "\blue Now you hear emotes only from nearest creatures."
|
|
|
|
|
|
|
|
/mob/verb/observe()
|
|
set name = "Observe"
|
|
set category = "OOC"
|
|
var/is_admin = 0
|
|
|
|
if (client.holder && client.holder.level >= 1 && ( client.holder.state == 2 || client.holder.level > 3 ))
|
|
is_admin = 1
|
|
else if (istype(src, /mob/new_player) || stat != 2)
|
|
usr << "\blue You must be observing to use this!"
|
|
return
|
|
|
|
if (is_admin && stat == 2)
|
|
is_admin = 0
|
|
|
|
var/list/names = list()
|
|
var/list/namecounts = list()
|
|
var/list/creatures = list()
|
|
|
|
for (var/obj/item/weapon/disk/nuclear/D in world)
|
|
var/name = "Nuclear Disk"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = D
|
|
|
|
for (var/obj/machinery/singularity/S in world)
|
|
var/name = "Singularity"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = S
|
|
|
|
for (var/obj/machinery/bot/B in world)
|
|
var/name = "BOT: [B.name]"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = B
|
|
/*
|
|
for (var/mob/living/silicon/decoy/D in world)
|
|
var/name = "[D.name]"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = D
|
|
*/
|
|
|
|
|
|
|
|
//THIS IS HOW YOU ADD OBJECTS TO BE OBSERVED
|
|
|
|
creatures += getmobs()
|
|
//THIS IS THE MOBS PART: LOOK IN HELPERS.DM
|
|
|
|
client.perspective = EYE_PERSPECTIVE
|
|
|
|
var/eye_name = null
|
|
|
|
if (is_admin)
|
|
eye_name = input("Please, select a player!", "Admin Observe", null, null) as null|anything in creatures
|
|
else
|
|
eye_name = input("Please, select a player!", "Observe", null, null) as null|anything in creatures
|
|
|
|
if (!eye_name)
|
|
return
|
|
|
|
var/mob/eye = creatures[eye_name]
|
|
if (is_admin)
|
|
if (eye)
|
|
reset_view(eye)
|
|
client.adminobs = 1
|
|
if(eye == client.mob)
|
|
client.adminobs = 0
|
|
else
|
|
reset_view(null)
|
|
client.adminobs = 0
|
|
else
|
|
if(ticker)
|
|
// world << "there's a ticker"
|
|
if(ticker.mode.name == "AI malfunction")
|
|
// world << "ticker says its malf"
|
|
var/datum/game_mode/malfunction/malf = ticker.mode
|
|
for (var/datum/mind/B in malf.malf_ai)
|
|
// world << "comparing [B.current] to [eye]"
|
|
if (B.current == eye)
|
|
for (var/mob/living/silicon/decoy/D in world)
|
|
if (eye)
|
|
eye = D
|
|
if (client)
|
|
if (eye)
|
|
client.eye = eye
|
|
else
|
|
client.eye = client.mob
|
|
|
|
/mob/verb/cancel_camera()
|
|
set name = "Cancel Camera View"
|
|
set category = "OOC"
|
|
reset_view(null)
|
|
machine = null
|
|
if(istype(src, /mob/living))
|
|
if(src:cameraFollow)
|
|
src:cameraFollow = null
|
|
|
|
/mob/Topic(href, href_list)
|
|
if(href_list["mach_close"])
|
|
var/t1 = text("window=[href_list["mach_close"]]")
|
|
machine = null
|
|
src << browse(null, t1)
|
|
// ..()
|
|
return
|
|
|
|
/mob/proc/get_damage()
|
|
return health
|
|
|
|
/mob/proc/UpdateLuminosity()
|
|
if(src.total_luminosity == src.last_luminosity) return 0//nothing to do here
|
|
src.last_luminosity = src.total_luminosity
|
|
sd_SetLuminosity(min(src.total_luminosity,7))//Current hardcode max at 7, should likely be a const somewhere else
|
|
return 1
|
|
|
|
/mob/MouseDrop(mob/M as mob)
|
|
..()
|
|
if(M != usr) return
|
|
if(usr == src) return
|
|
if(get_dist(usr,src) > 1) return
|
|
if(istype(M,/mob/living/silicon/ai)) return
|
|
if(LinkBlocked(usr.loc,loc)) return
|
|
show_inv(usr)
|
|
|
|
/atom/movable/verb/pull()
|
|
set name = "Pull"
|
|
set category = "IC"
|
|
set src in oview(1)
|
|
|
|
if ( !usr || usr==src || !istype(src.loc,/turf) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
|
|
return
|
|
if (!( anchored ))
|
|
usr.pulling = src
|
|
if(ismob(src))
|
|
var/mob/M = src
|
|
if(!istype(usr, /mob/living/carbon))
|
|
M.LAssailant = null
|
|
else
|
|
M.LAssailant = usr
|
|
return
|
|
|
|
/atom/verb/examine()
|
|
set name = "Examine"
|
|
set category = "IC"
|
|
set src in oview(12) //make it work from farther away
|
|
|
|
if (!( usr ))
|
|
return
|
|
usr << "That's \a [src]." //changed to "That's" from "This is" because "This is some metal sheets" sounds dumb compared to "That's some metal sheets" ~Carn
|
|
usr << desc
|
|
// *****RM
|
|
//usr << "[name]: Dn:[density] dir:[dir] cont:[contents] icon:[icon] is:[icon_state] loc:[loc]"
|
|
return
|
|
|
|
/mob/proc/can_use_hands()
|
|
if(handcuffed)
|
|
return 0
|
|
if(buckled && ! istype(buckled, /obj/structure/stool/bed/chair)) // buckling does not restrict hands
|
|
return 0
|
|
return ..()
|
|
|
|
/mob/proc/is_active()
|
|
return (0 >= usr.stat)
|
|
|
|
/mob/proc/see(message)
|
|
if(!is_active())
|
|
return 0
|
|
src << message
|
|
return 1
|
|
|
|
/mob/proc/show_viewers(message)
|
|
for(var/mob/M in viewers())
|
|
M.see(message)
|
|
|
|
/*
|
|
adds a dizziness amount to a mob
|
|
use this rather than directly changing var/dizziness
|
|
since this ensures that the dizzy_process proc is started
|
|
currently only humans get dizzy
|
|
|
|
value of dizziness ranges from 0 to 1000
|
|
below 100 is not dizzy
|
|
*/
|
|
/mob/proc/make_dizzy(var/amount)
|
|
if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
|
|
return
|
|
|
|
dizziness = min(1000, dizziness + amount) // store what will be new value
|
|
// clamped to max 1000
|
|
if(dizziness > 100 && !is_dizzy)
|
|
spawn(0)
|
|
dizzy_process()
|
|
|
|
|
|
/*
|
|
dizzy process - wiggles the client's pixel offset over time
|
|
spawned from make_dizzy(), will terminate automatically when dizziness gets <100
|
|
note dizziness decrements automatically in the mob's Life() proc.
|
|
*/
|
|
/mob/proc/dizzy_process()
|
|
is_dizzy = 1
|
|
while(dizziness > 100)
|
|
if(client)
|
|
var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70
|
|
client.pixel_x = amplitude * sin(0.008 * dizziness * world.time)
|
|
client.pixel_y = amplitude * cos(0.008 * dizziness * world.time)
|
|
|
|
sleep(1)
|
|
//endwhile - reset the pixel offsets to zero
|
|
is_dizzy = 0
|
|
if(client)
|
|
client.pixel_x = 0
|
|
client.pixel_y = 0
|
|
|
|
// jitteriness - copy+paste of dizziness
|
|
|
|
/mob/proc/make_jittery(var/amount)
|
|
if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
|
|
return
|
|
|
|
jitteriness = min(1000, jitteriness + amount) // store what will be new value
|
|
// clamped to max 1000
|
|
if(jitteriness > 100 && !is_jittery)
|
|
spawn(0)
|
|
jittery_process()
|
|
|
|
|
|
// Typo from the oriignal coder here, below lies the jitteriness process. So make of his code what you will, the previous comment here was just a copypaste of the above.
|
|
/mob/proc/jittery_process()
|
|
var/old_x = pixel_x
|
|
var/old_y = pixel_y
|
|
is_jittery = 1
|
|
while(jitteriness > 100)
|
|
// var/amplitude = jitteriness*(sin(jitteriness * 0.044 * world.time) + 1) / 70
|
|
// pixel_x = amplitude * sin(0.008 * jitteriness * world.time)
|
|
// pixel_y = amplitude * cos(0.008 * jitteriness * world.time)
|
|
|
|
var/amplitude = min(4, jitteriness / 100)
|
|
pixel_x = rand(-amplitude, amplitude)
|
|
pixel_y = rand(-amplitude/3, amplitude/3)
|
|
|
|
sleep(1)
|
|
//endwhile - reset the pixel offsets to zero
|
|
is_jittery = 0
|
|
pixel_x = old_x
|
|
pixel_y = old_y
|
|
|
|
/mob/Stat()
|
|
..()
|
|
|
|
statpanel("Status")
|
|
|
|
if (client && client.holder)
|
|
stat(null, "([x], [y], [z])")
|
|
stat(null, "CPU: [world.cpu]")
|
|
if (master_controller)
|
|
stat(null, "Current Iteration: [controller_iteration]")
|
|
stat(null, "Time between ticks: [last_tick_duration]")
|
|
|
|
|
|
if (spell_list.len)
|
|
|
|
for(var/obj/effect/proc_holder/spell/S in spell_list)
|
|
switch(S.charge_type)
|
|
if("recharge")
|
|
statpanel("Spells","[S.charge_counter/10.0]/[S.charge_max/10]",S)
|
|
if("charges")
|
|
statpanel("Spells","[S.charge_counter]/[S.charge_max]",S)
|
|
if("holdervar")
|
|
statpanel("Spells","[S.holder_var_type] [S.holder_var_amount]",S)
|
|
|
|
|
|
|
|
// facing verbs
|
|
/mob/proc/canface()
|
|
if(!canmove) return 0
|
|
if(client.moving) return 0
|
|
if(world.time < client.move_delay) return 0
|
|
if(stat==2) return 0
|
|
if(anchored) return 0
|
|
if(monkeyizing) return 0
|
|
if(restrained()) return 0
|
|
return 1
|
|
|
|
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
|
|
/mob/proc/update_canmove()
|
|
if( stat || weakened || paralysis || resting || sleeping || (changeling && changeling.changeling_fakedeath) )
|
|
lying = 1
|
|
canmove = 0
|
|
else if( stunned )
|
|
// lying = 0
|
|
canmove = 0
|
|
else
|
|
lying = 0
|
|
canmove = 1
|
|
|
|
if(buckled)
|
|
anchored = 1
|
|
if( istype(buckled,/obj/structure/stool/bed/chair) )
|
|
lying = 0
|
|
else
|
|
lying = 1
|
|
|
|
if(lying)
|
|
density = 0
|
|
drop_l_hand()
|
|
drop_r_hand()
|
|
else
|
|
density = 1
|
|
|
|
//Temporarily moved here from the various life() procs
|
|
//I'm fixing stuff incrementally so this will likely find a better home.
|
|
//It just makes sense for now. ~Carn
|
|
if( update_icon ) //forces a full overlay update
|
|
update_icon = 0
|
|
regenerate_icons()
|
|
else if( lying != lying_prev )
|
|
update_icons()
|
|
|
|
return canmove
|
|
|
|
|
|
/mob/verb/eastface()
|
|
set hidden = 1
|
|
if(!canface()) return 0
|
|
dir = EAST
|
|
client.move_delay += movement_delay()
|
|
return 1
|
|
|
|
|
|
/mob/verb/westface()
|
|
set hidden = 1
|
|
if(!canface()) return 0
|
|
dir = WEST
|
|
client.move_delay += movement_delay()
|
|
return 1
|
|
|
|
|
|
/mob/verb/northface()
|
|
set hidden = 1
|
|
if(!canface()) return 0
|
|
dir = NORTH
|
|
client.move_delay += movement_delay()
|
|
return 1
|
|
|
|
|
|
/mob/verb/southface()
|
|
set hidden = 1
|
|
if(!canface()) return 0
|
|
dir = SOUTH
|
|
client.move_delay += movement_delay()
|
|
return 1
|
|
|
|
|
|
/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
|
|
return 0
|
|
|
|
|
|
/mob/proc/Stun(amount)
|
|
if(canstun)
|
|
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
|
|
else
|
|
if(istype(src, /mob/living/carbon/alien)) // add some movement delay
|
|
var/mob/living/carbon/alien/Alien = src
|
|
Alien.move_delay_add = min(Alien.move_delay_add + round(amount / 2), 10) // a maximum delay of 10
|
|
return
|
|
|
|
/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
|
|
if(canstun)
|
|
stunned = max(amount,0)
|
|
return
|
|
|
|
/mob/proc/AdjustStunned(amount)
|
|
if(canstun)
|
|
stunned = max(stunned + amount,0)
|
|
return
|
|
|
|
/mob/proc/Weaken(amount)
|
|
if(canweaken)
|
|
weakened = max(max(weakened,amount),0)
|
|
update_canmove() //updates lying, canmove and icons
|
|
return
|
|
|
|
/mob/proc/SetWeakened(amount)
|
|
if(canweaken)
|
|
weakened = max(amount,0)
|
|
update_canmove() //updates lying, canmove and icons
|
|
return
|
|
|
|
/mob/proc/AdjustWeakened(amount)
|
|
if(canweaken)
|
|
weakened = max(weakened + amount,0)
|
|
update_canmove() //updates lying, canmove and icons
|
|
return
|
|
|
|
/mob/proc/Paralyse(amount)
|
|
paralysis = max(max(paralysis,amount),0)
|
|
return
|
|
|
|
/mob/proc/SetParalysis(amount)
|
|
paralysis = max(amount,0)
|
|
return
|
|
|
|
/mob/proc/AdjustParalysis(amount)
|
|
paralysis = max(paralysis + amount,0)
|
|
return
|
|
|
|
/mob/proc/Sleeping(amount)
|
|
sleeping = max(max(sleeping,amount),0)
|
|
return
|
|
|
|
/mob/proc/SetSleeping(amount)
|
|
sleeping = max(amount,0)
|
|
return
|
|
|
|
/mob/proc/AdjustSleeping(amount)
|
|
sleeping = max(sleeping + amount,0)
|
|
return
|
|
|
|
/mob/proc/Resting(amount)
|
|
resting = max(max(resting,amount),0)
|
|
return
|
|
|
|
/mob/proc/SetResting(amount)
|
|
resting = max(amount,0)
|
|
return
|
|
|
|
/mob/proc/AdjustResting(amount)
|
|
resting = max(resting + amount,0)
|
|
return
|
|
|
|
/mob/proc/getMaxHealth()
|
|
return maxHealth
|
|
|
|
/mob/proc/setMaxHealth(var/newMaxHealth)
|
|
maxHealth = newMaxHealth
|
|
|
|
/*
|
|
* Sends resource files to client cache
|
|
*/
|
|
/mob/proc/getFiles()
|
|
if(!isemptylist(args))
|
|
for(var/file in args)
|
|
src << browse_rsc(file)
|
|
return 1
|
|
return 0 |