Tg patch branch to master (#192)

* code nitpicking

* Midnight oil

More like 6am oil.  Still having issues with actually eating anyone.

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* missed commit

* Noms

* specific release doesn't work

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* admin QOL

needs callback porting, TBD

* Mentor system initial port

I'm sure I've missed a fuckton of shit

* test merge

* Jesus tits did this finally fix compile issues?

* Tg modern (#149)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* test merge

* Jesus tits did this finally fix compile issues?

* Initial test compiles. hooray.

* Admin ticket fixes

* I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum

* who list wip

also ahelps are broken again. fuck if I know why

* discord bot basics

* maybe tickets work now & bot framework done

* ahelp callback readd

* Mentor system, Tickets, and discord (#151)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* admin QOL

needs callback porting, TBD

* Mentor system initial port

I'm sure I've missed a fuckton of shit

* test merge

* Jesus tits did this finally fix compile issues?

* Initial test compiles. hooray.

* Admin ticket fixes

* I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum

* who list wip

also ahelps are broken again. fuck if I know why

* discord bot basics

* maybe tickets work now & bot framework done

* ahelp callback readd

* vore tweaks

* progress

* dirtier fix than a korean hooker in the 60s

* The release your hooker will always fake

* you could save that hookers number but wouldn't you rather just vore the hooker instead

* Save system is literal black magic

* great googly moogly it's all gone to shit

* We May 2015 save code now

* fiddling with digestion code now

* fuck if I know anymore. I'm going to bed

* OWN UP YOUR OWN DIGESTION

* UNREGULATED GUTS ARE NON COMPLIANT

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

* BELLIES MUST COMPLY WITH USER OWNERSHIP

* Removed debug messages

* Unneeded verb additions

* file change tweaks

* WATCH YOUR SPACING, DRIVER

* Changelog and devourment for some mobs.

Because I knew people were gunna ask.

NO YOU CANNOT EAT THE FUCKING LEGION

* Vore code sync (#157)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Escape and Devourable

For the normies who play here yet complain about it.

* Things that should be committed

* unneeded files

* Sizeray works now

* tweaks and bed time going

* IT WORKS mostly

Need to get multiple guts and saving working tho

* save tweaks

* item hotfix

* gut examine message

* damifino

* save system works

also ensured some mobs have vore controls, so silicons can't even
remotely do vore things.

* code nitpicking

* Midnight oil

More like 6am oil.  Still having issues with actually eating anyone.

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* missed commit

* Noms

* specific release doesn't work

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* admin QOL

needs callback porting, TBD

* Mentor system initial port

I'm sure I've missed a fuckton of shit

* test merge

* Jesus tits did this finally fix compile issues?

* Initial test compiles. hooray.

* Admin ticket fixes

* I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum

* who list wip

also ahelps are broken again. fuck if I know why

* discord bot basics

* maybe tickets work now & bot framework done

* ahelp callback readd

* vore tweaks

* progress

* dirtier fix than a korean hooker in the 60s

* The release your hooker will always fake

* you could save that hookers number but wouldn't you rather just vore the hooker instead

* Save system is literal black magic

* great googly moogly it's all gone to shit

* We May 2015 save code now

* fiddling with digestion code now

* fuck if I know anymore. I'm going to bed

* OWN UP YOUR OWN DIGESTION

* UNREGULATED GUTS ARE NON COMPLIANT

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

* BELLIES MUST COMPLY WITH USER OWNERSHIP

* Removed debug messages

* Unneeded verb additions

* file change tweaks

* WATCH YOUR SPACING, DRIVER

* Changelog and devourment for some mobs.

Because I knew people were gunna ask.

NO YOU CANNOT EAT THE FUCKING LEGION

* title screen change from Crow's PR.

* More of Crow's title screen stuff

* mode tweaks.... again

* gamemode voting in lobby via TalkingCactus
disabled ashwalkers as roundstart
Verk's species tweak
paralax starts disabled by default

* LOOC

* index sync problem (#158)

* digifix

* things

* furry races.dm

* actually deletes species_types

* maps

* tgui and stuff

* Sounds

* icon updates

* Defines and helpers

* global vars and on click

* controllers

* datums

* game folder

* fixes invisible flan mobs

* some modules

* dropbomb verb enhanced

* moar

* moar

* moar

* even more again

* and finally these for modules

* Some compile tweaks

* silly dme get updated you scrub

* compiles cleanly now

* various open PR fixes from TG

as of 0800 Texas Standard Time

* also fancy cryopods before I forget again

* headslug gold core fix

* edgy code of the modernization (#164)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Escape and Devourable

For the normies who play here yet complain about it.

* Things that should be committed

* unneeded files

* Sizeray works now

* tweaks and bed time going

* IT WORKS mostly

Need to get multiple guts and saving working tho

* save tweaks

* item hotfix

* gut examine message

* damifino

* save system works

also ensured some mobs have vore controls, so silicons can't even
remotely do vore things.

* code nitpicking

* Midnight oil

More like 6am oil.  Still having issues with actually eating anyone.

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* missed commit

* Noms

* specific release doesn't work

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* admin QOL

needs callback porting, TBD

* Mentor system initial port

I'm sure I've missed a fuckton of shit

* test merge

* Jesus tits did this finally fix compile issues?

* Initial test compiles. hooray.

* Admin ticket fixes

* I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum

* who list wip

also ahelps are broken again. fuck if I know why

* discord bot basics

* maybe tickets work now & bot framework done

* ahelp callback readd

* vore tweaks

* progress

* Small fixes for dogborgs and sprite accessories:
-Ported the hidden snippets of the dogborg code.
-Reset module now resets pixel offset and icon directory again. (broke shit when reseting from dogborg)
-Medihound belly fixed.
-Husky body marking tweaked to not overlap arms in side view.
-Added husky ears that are basically wolf ears that use secondary color instead.

* dirtier fix than a korean hooker in the 60s

* The release your hooker will always fake

* you could save that hookers number but wouldn't you rather just vore the hooker instead

* Save system is literal black magic

* great googly moogly it's all gone to shit

* We May 2015 save code now

* fiddling with digestion code now

* fuck if I know anymore. I'm going to bed

* OWN UP YOUR OWN DIGESTION

* UNREGULATED GUTS ARE NON COMPLIANT

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

* BELLIES MUST COMPLY WITH USER OWNERSHIP

* Removed debug messages

* Unneeded verb additions

* file change tweaks

* WATCH YOUR SPACING, DRIVER

* Changelog and devourment for some mobs.

Because I knew people were gunna ask.

NO YOU CANNOT EAT THE FUCKING LEGION

* title screen change from Crow's PR.

* More of Crow's title screen stuff

* mode tweaks.... again

* gamemode voting in lobby via TalkingCactus
disabled ashwalkers as roundstart
Verk's species tweak
paralax starts disabled by default

* LOOC

* index sync problem (#158)

* digifix

* things

* furry races.dm

* actually deletes species_types

* maps

* tgui and stuff

* Sounds

* icon updates

* Defines and helpers

* global vars and on click

* controllers

* datums

* game folder

* fixes invisible flan mobs

* some modules

* dropbomb verb enhanced

* moar

* moar

* moar

* even more again

* and finally these for modules

* Some compile tweaks

* silly dme get updated you scrub

* compiles cleanly now

* various open PR fixes from TG

as of 0800 Texas Standard Time

* also fancy cryopods before I forget again

* headslug gold core fix

* some species and DNA tweaks

* Digest already damn you

* suddenly sound and resist works. wtf

* Minor tweaks, cryopod noise change

* Vore tested working, species working

* Merge test onto bleeding edgy (#165)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Escape and Devourable

For the normies who play here yet complain about it.

* Things that should be committed

* unneeded files

* Sizeray works now

* tweaks and bed time going

* IT WORKS mostly

Need to get multiple guts and saving working tho

* save tweaks

* item hotfix

* gut examine message

* damifino

* save system works

also ensured some mobs have vore controls, so silicons can't even
remotely do vore things.

* code nitpicking

* Midnight oil

More like 6am oil.  Still having issues with actually eating anyone.

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* missed commit

* Noms

* specific release doesn't work

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* admin QOL

needs callback porting, TBD

* Mentor system initial port

I'm sure I've missed a fuckton of shit

* test merge

* Jesus tits did this finally fix compile issues?

* Initial test compiles. hooray.

* Admin ticket fixes

* I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum

* who list wip

also ahelps are broken again. fuck if I know why

* discord bot basics

* maybe tickets work now & bot framework done

* ahelp callback readd

* vore tweaks

* progress

* Small fixes for dogborgs and sprite accessories:
-Ported the hidden snippets of the dogborg code.
-Reset module now resets pixel offset and icon directory again. (broke shit when reseting from dogborg)
-Medihound belly fixed.
-Husky body marking tweaked to not overlap arms in side view.
-Added husky ears that are basically wolf ears that use secondary color instead.

* dirtier fix than a korean hooker in the 60s

* The release your hooker will always fake

* you could save that hookers number but wouldn't you rather just vore the hooker instead

* Save system is literal black magic

* great googly moogly it's all gone to shit

* We May 2015 save code now

* fiddling with digestion code now

* fuck if I know anymore. I'm going to bed

* OWN UP YOUR OWN DIGESTION

* UNREGULATED GUTS ARE NON COMPLIANT

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

* BELLIES MUST COMPLY WITH USER OWNERSHIP

* Removed debug messages

* Unneeded verb additions

* file change tweaks

* WATCH YOUR SPACING, DRIVER

* Changelog and devourment for some mobs.

Because I knew people were gunna ask.

NO YOU CANNOT EAT THE FUCKING LEGION

* title screen change from Crow's PR.

* More of Crow's title screen stuff

* mode tweaks.... again

* gamemode voting in lobby via TalkingCactus
disabled ashwalkers as roundstart
Verk's species tweak
paralax starts disabled by default

* LOOC

* index sync problem (#158)

* digifix

* things

* furry races.dm

* actually deletes species_types

* maps

* tgui and stuff

* Sounds

* icon updates

* Defines and helpers

* global vars and on click

* controllers

* datums

* game folder

* fixes invisible flan mobs

* some modules

* dropbomb verb enhanced

* moar

* moar

* moar

* even more again

* and finally these for modules

* Some compile tweaks

* silly dme get updated you scrub

* compiles cleanly now

* various open PR fixes from TG

as of 0800 Texas Standard Time

* also fancy cryopods before I forget again

* headslug gold core fix

* some species and DNA tweaks

* Digest already damn you

* suddenly sound and resist works. wtf

* Minor tweaks, cryopod noise change

* Vore tested working, species working

* travis map updates

* updates

* pool's closed due to lag

* datum pools are closed too

* Initializing new pool's closed

* Pool's closed and initializing shit is done

* sprite updates

* chattering is okay to do now.

* bleeblin edgy 1/23 (#166)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Escape and Devourable

For the normies who play here yet complain about it.

* Things that should be committed

* unneeded files

* Sizeray works now

* tweaks and bed time going

* IT WORKS mostly

Need to get multiple guts and saving working tho

* save tweaks

* item hotfix

* gut examine message

* damifino

* save system works

also ensured some mobs have vore controls, so silicons can't even
remotely do vore things.

* code nitpicking

* Midnight oil

More like 6am oil.  Still having issues with actually eating anyone.

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* missed commit

* Noms

* specific release doesn't work

* Tg modernization patch (#115)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes

* port from cactus did

* fix format error

* Update preferences.dm

unfuck

* Revert "port from cactus did"

* unfuck

* more sprite work

* vore

* disabled roundstart xenos for now

* admin QOL

needs callback porting, TBD

* Mentor system initial port

I'm sure I've missed a fuckton of shit

* test merge

* Jesus tits did this finally fix compile issues?

* Initial test compiles. hooray.

* Admin ticket fixes

* I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum

* who list wip

also ahelps are broken again. fuck if I know why

* discord bot basics

* maybe tickets work now & bot framework done

* ahelp callback readd

* vore tweaks

* progress

* Small fixes for dogborgs and sprite accessories:
-Ported the hidden snippets of the dogborg code.
-Reset module now resets pixel offset and icon directory again. (broke shit when reseting from dogborg)
-Medihound belly fixed.
-Husky body marking tweaked to not overlap arms in side view.
-Added husky ears that are basically wolf ears that use secondary color instead.

* dirtier fix than a korean hooker in the 60s

* The release your hooker will always fake

* you could save that hookers number but wouldn't you rather just vore the hooker instead

* Save system is literal black magic

* great googly moogly it's all gone to shit

* We May 2015 save code now

* fiddling with digestion code now

* fuck if I know anymore. I'm going to bed

* OWN UP YOUR OWN DIGESTION

* UNREGULATED GUTS ARE NON COMPLIANT

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

* BELLIES MUST COMPLY WITH USER OWNERSHIP

* Removed debug messages

* Unneeded verb additions

* file change tweaks

* WATCH YOUR SPACING, DRIVER

* Changelog and devourment for some mobs.

Because I knew people were gunna ask.

NO YOU CANNOT EAT THE FUCKING LEGION

* title screen change from Crow's PR.

* More of Crow's title screen stuff

* mode tweaks.... again

* gamemode voting in lobby via TalkingCactus
disabled ashwalkers as roundstart
Verk's species tweak
paralax starts disabled by default

* LOOC

* index sync problem (#158)

* digifix

* things

* furry races.dm

* actually deletes species_types

* maps

* tgui and stuff

* Sounds

* icon updates

* Defines and helpers

* global vars and on click

* controllers

* datums

* game folder

* fixes invisible flan mobs

* some modules

* dropbomb verb enhanced

* moar

* moar

* moar

* even more again

* and finally these for modules

* Some compile tweaks

* silly dme get updated you scrub

* compiles cleanly now

* various open PR fixes from TG

as of 0800 Texas Standard Time

* also fancy cryopods before I forget again

* headslug gold core fix

* some species and DNA tweaks

* Digest already damn you

* suddenly sound and resist works. wtf

* Minor tweaks, cryopod noise change

* Vore tested working, species working

* travis map updates

* updates

* pool's closed due to lag

* datum pools are closed too

* Initializing new pool's closed

* Pool's closed and initializing shit is done

* sprite updates

* chattering is okay to do now.

* Update .travis.yml

* Update .travis.yml

* Update .travis.yml

* Revert "Modern modern"

* Revert "Revert "Modern modern""

* fix it fix it fix it fix it

* fixes title screen - thanks crow

* Riding code reverted

* possible tgui fix?

* who the fuck even knows if this is the problem

* adds moths and sharks (no colors yet, not greyscaled)
adds LOOC back

* "fixes" missing items in some machinery.

* slight tweaks to abductor spawns
borer event enabled (max 1)

* Update .travis.yml

* fixes shuttle purchase from comms

* fixes and QoL

* Polymorphing all is dangerous too

* re-fixes ahelp ticket system again

* metagaming check proving to be spamlicious

* Fixes not being able to see devoured mob poses

* fix for vehicle buckling

* ahelp timer runtime fix (#178)

* controller and game updates 1/29

* Defines, helpers, datums 1/29

* world.dm updates

* modules/admin tweaks

* everything in modules not a mob

* modules/mob fixes and such

No more PAIs ventcrawling

* icons, maps, tools, etc.

* compiler fixes

* round type vote fixed

* hardsuit cargo pack

* reduce ion and electric storm chance

* perms access for travis

* fix helmet to the suit
removes CE from crate

* changelog

* fuck

* perms for travis... again

* Update tgstation.dme

* Update tgstation.dme

* Donation race

* redpanda

* red panda

* size play work

* Size chemical basics

Needs testing/refining

* some fixing ports before I just fucking ported it anyway

* It's been a fucking week.

* commiting moar changes because github

* admins.txt lol

* icons

* defines and such

* globalvars and onclick

* Controllers

* datums

* game folder

* oh look, HoG is back

* modules pt 1

* client things

* more modules

* everything not mob code

* some mob stuff

* more mob things

* silicon mobs

* ayylims and monkeys

* human updates

* huh

* housekeeping is fired.

* last minute fixes

* more last minute things

* human parts double check'd

* more paper

* Icons are fixed

* double check of thermal protection code. (#191)
This commit is contained in:
TalkingCactus
2017-02-03 06:56:14 -05:00
committed by Poojawa
parent 7735dec0ec
commit f7c09077d2
2489 changed files with 830965 additions and 416701 deletions
+39 -5
View File
@@ -1,11 +1,8 @@
//THIS FILE CONTAINS CONSTANTS, PROCS, DEFINES, AND OTHER THINGS//
////////////////////////////////////////////////////////////////////
var/const/SIZEPLAY_TINY=1
var/const/SIZEPLAY_MICRO=2
var/const/SIZEPLAY_NORMAL=3
var/const/SIZEPLAY_MACRO=4
var/const/SIZEPLAY_HUGE=5
/mob/proc/setClickCooldown(var/timeout)
next_move = max(world.time + timeout, next_move)
/proc/get_matrix_largest()
var/matrix/mtrx=new()
@@ -31,4 +28,41 @@ proc/get_racelist(var/mob/user)//This proc returns a list of species that 'user'
whitelisted_species_list[S.id] = S.type //Add the species to their available species list.
else if(!S.whitelisted && S.roundstart) //Normal roundstart species will be handled here.
whitelisted_species_list[S.id] = S.type
return whitelisted_species_list
//Mammal Species
var/global/list/mam_body_markings_list = list()
var/global/list/mam_ears_list = list()
var/global/list/mam_tails_list = list()
var/global/list/mam_tails_animated_list = list()
//Exotic Species
var/global/list/exotic_tails_list = list()
var/global/list/exotic_tails_animated_list = list()
var/global/list/exotic_ears_list = list()
var/global/list/exotic_head_list = list()
var/global/list/exotic_back_list = list()
//Xenomorph Species
var/global/list/xeno_head_list = list() //I forgot the ' = list()' part for the longest time and couldn't figure out what was wrong. *facepalm
var/global/list/xeno_tail_list = list()
var/global/list/xeno_dorsal_list = list()
//mentor stuff
var/list/mentors = list()
/client/proc/reload_mentors()
set name = "Reload Mentors"
set category = "Admin"
if(!src.holder) return
message_admins("[key_name_admin(usr)] manually reloaded mentors")
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavor Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = copytext(sanitize(input(usr, "Please enter your new flavor text.", "Flavor text", null) as text), 1)
+13
View File
@@ -0,0 +1,13 @@
/proc/send2maindiscord(var/msg)
send2discord(msg, FALSE)
/proc/send2admindiscord(var/msg, var/ping = FALSE)
send2discord(msg, TRUE, ping)
/proc/send2discord(var/msg, var/admin = FALSE, var/ping = FALSE)
// if (!config.discord_url || !config.discord_password)
// return
// var/url = "[config.discord_url]?pass=[url_encode(config.discord_password)]&admin=[admin ? "true" : "false"]&content=[url_encode(msg)]&ping=[ping ? "true" : "false"]"
// world.Export(url)
return
+87
View File
@@ -0,0 +1,87 @@
/**
* Startup hook.
* Called in world.dm when the server starts.
*/
/hook/startup
/**
* Roundstart hook.
* Called in gameticker.dm when a round starts.
*/
/hook/roundstart
/**
* Roundend hook.
* Called in gameticker.dm when a round ends.
*/
/hook/roundend
/**
* Death hook.
* Called in death.dm when someone dies.
* Parameters: var/mob/living/carbon/human, var/gibbed
*/
/hook/death
/**
* Cloning hook.
* Called in cloning.dm when someone is brought back by the wonders of modern science.
* Parameters: var/mob/living/carbon/human
*/
/hook/clone
/**
* Debrained hook.
* Called in brain_item.dm when someone gets debrained.
* Parameters: var/obj/item/organ/brain
*/
/hook/debrain
/**
* Borged hook.
* Called in robot_parts.dm when someone gets turned into a cyborg.
* Parameters: var/mob/living/silicon/robot
*/
/hook/borgify
/**
* Podman hook.
* Called in podmen.dm when someone is brought back as a Diona.
* Parameters: var/mob/living/carbon/alien/diona
*/
/hook/harvest_podman
/**
* Payroll revoked hook.
* Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal.
* Parameters: var/datum/money_account
*/
/hook/revoke_payroll
/**
* Account suspension hook.
* Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal.
* Parameters: var/datum/money_account
*/
/hook/change_account_status
/**
* Employee reassignment hook.
* Called in card.dm when someone's card is reassigned at the HoP's desk.
* Parameters: var/obj/item/weapon/card/id
*/
/hook/reassign_employee
/**
* Employee terminated hook.
* Called in card.dm when someone's card is terminated at the HoP's desk.
* Parameters: var/obj/item/weapon/card/id
*/
/hook/terminate_employee
/**
* Crate sold hook.
* Called in supplyshuttle.dm when a crate is sold on the shuttle.
* Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle
*/
/hook/sell_crate
+62 -112
View File
@@ -14,26 +14,23 @@
var/vore_sound = 'sound/vore/gulp.ogg' // Sound when ingesting someone
var/vore_verb = "ingest" // Verb for eating with this in messages
var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
var/nonhuman_prey_swallow_time = 100 // Time in deciseconds to swallow anything else
var/emoteTime = 600 // How long between stomach emotes at prey
var/nonhuman_prey_swallow_time = 60 // Time in deciseconds to swallow anything else
var/emoteTime = 300 // How long between stomach emotes at prey
var/digest_brute = 1 // Brute damage per tick in digestion mode
var/digest_burn = 1 // Burn damage per tick in digestion mode
var/digest_tickrate = 3 // Modulus this of air controller tick number to iterate gurgles on
var/digest_burn = 3 // Burn damage per tick in digestion mode
var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on
var/immutable = 0 // Prevents this belly from being deleted
var/integrity = 100 // Gut 'health' weakened by non help intent stuggles
var/escapable = 0 // Belly can be resisted out of at any time
var/escapetime = 600 // Deciseconds, how long to escape this belly
var/escapable = 1 // Belly can be resisted out of at any time
var/escapetime = 200 // Deciseconds, how long to escape this belly
var/escapechance = 45 // % Chance of prey beginning to escape if prey struggles.
var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_DIGESTF) // Possible digest modes
var/tmp/mob/living/owner // The mob whose belly this is.
var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
var/tmp/emotePend = 0 // If there's already a spawned thing counting for the next emote
var/tmp/recent_struggle = 0 // Flag to prevent struggle emote spam
// Don't forget to watch your commas at the end of each line if you change these.
var/datum/gas_mixture/air_contents = new() // Belly Air stuff
// Don't forget to watch your commas at the end of each line if you change these.
var/list/struggle_messages_outside = list(
"%pred's %belly wobbles with a squirming meal.",
"%pred's %belly jostles with movement.",
@@ -105,13 +102,15 @@
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
// Returns the number of mobs so released.
/datum/belly/proc/release_all_contents()
if (internal_contents.len == 0)
return 0
for (var/atom/movable/M in internal_contents)
M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
internal_contents -= M // Remove from the belly contents
internal_contents.Remove(M) // Remove from the belly contents
var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob
if(B)
B.internal_contents += M
B.internal_contents.Add(M)
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
return 1
@@ -124,14 +123,13 @@
return 0 // They weren't in this belly anyway
M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
src.internal_contents -= M // Remove from the belly contents
src.internal_contents.Add(M) // Remove from the belly contents
var/datum/belly/B = check_belly(owner)
if(B)
B.internal_contents += M
B.internal_contents.Add(M)
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
owner.update_icons()
// owner.regenerate_icons()
return 1
// Actually perform the mechanics of devouring the tasty prey.
@@ -141,9 +139,8 @@
// if (prey.buckled)
// prey.buckled.unbuckle_mob()
// Super super messy. prey.forceMove.owner doesn't work if there's no prey.
prey.loc = user
internal_contents |= prey
prey.forceMove(owner)
internal_contents.Add(prey)
if(inside_flavor)
prey << "<span class='notice'><B>[inside_flavor]</B></span>"
@@ -192,12 +189,10 @@
var/list/raw_list = text2list(html_encode(raw_text),delim)
if(raw_list.len > 10)
raw_list.Cut(11)
log_attack("[owner] tried to set [name] with 11+ messages")
for(var/i = 1, i <= raw_list.len, i++)
if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
raw_list.Cut(i,i)
log_attack("[owner] tried to set [name] with >121 or <10 char message")
else
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
@@ -223,54 +218,42 @@
// Called from the process_Life() methods of bellies that digest prey.
// Default implementation calls M.death() and removes from internal contents.
// Indigestable items are removed, and M is deleted.
/datum/belly/proc/digestion_death(var/mob/living/M, var/mob/prey, var/mob/pred)
/datum/belly/proc/digestion_death(var/mob/living/M)
is_full = 1
M.death(1)
internal_contents -= M
internal_contents.Remove(M)
// If digested prey is also a pred... anyone inside their bellies gets moved up.
if (is_vore_predator(M))
for (var/bellytype in M.vore_organs)
var/datum/belly/belly = M.vore_organs[bellytype]
for (var/obj/SubPrey in belly.internal_contents)
SubPrey.forceMove(owner)
internal_contents += SubPrey
SubPrey << "As [M] melts away around you, you find yourself in [owner]'s [name]"
for (var/obj/thing in belly.internal_contents)
thing.loc = owner
internal_contents.Add(thing)
for (var/mob/subprey in belly.internal_contents)
subprey.loc = owner
internal_contents.Add(subprey)
subprey << "As [M] melts away around you, you find yourself in [owner]'s [name]"
//Drop all items into the belly.
if (config.items_survive_digestion)
for (var/obj/item/W in M)
_handle_digested_item(W)
for(var/obj/item/W in M)
if(!M.dropItemToGround(W))
qdel(W)
//Reagent transfer
if(M.reagents && istype(M.reagents,/datum/reagents))
var/datum/reagents/RL = M.reagents
RL.trans_to(owner,RL.total_volume*0.5)
message_admins("[key_name(owner)] digested [key_name(M)].")
log_attack("[key_name(owner)] digested [key_name(M)].")
// Delete the digested mob
message_admins("[key_name(pred)] digested [key_name(prey)].")
log_attack("[key_name(pred)] digested [key_name(prey)].")
qdel(M)
// Recursive method - To recursively scan thru someone's inventory for digestable/indigestable.
/datum/belly/proc/_handle_digested_item(var/obj/item/W)
W.forceMove(owner)
internal_contents += W
/datum/belly/proc/_is_digestable(var/obj/item/I)
return 1
//Handle a mob struggling
// Called from /mob/living/carbon/relaymove()
/datum/belly/proc/relay_resist(var/mob/living/R)
var/struggle_outer_message = pick(struggle_messages_outside)
var/struggle_user_message = pick(struggle_messages_inside)
if (!(R in internal_contents))
return // User is not in this belly, or struggle too soon.
// R.setClickCooldown(50)
R.setClickCooldown(50)
if(owner.stat || escapable) //If owner is stat (dead, KO) we can actually escape, or if belly is set to escapable (non-default)
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
R << "<span class='warning'>You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.)</span>"
owner << "<span class='warning'>Someone is attempting to climb out of your [name]!</span>"
@@ -285,6 +268,8 @@
owner << "<span class='notice'>The attempt to escape from your [name] has failed!</span>"
return
return
var/struggle_outer_message = pick(struggle_messages_outside)
var/struggle_user_message = pick(struggle_messages_inside)
struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
@@ -298,70 +283,35 @@
struggle_user_message = "<span class='alert'>" + struggle_user_message + "</span>"
for(var/mob/M in hearers(4, owner))
M.show_message(struggle_outer_message, 2) // hearable
M.visible_message(struggle_outer_message, 2) // hearable
R << struggle_user_message
var/strpick = pick(struggle_sounds)
var/strsound = struggle_sounds[strpick]
playsound(R.loc, strsound, 50, 1)
playsound(R.loc, "struggle_sounds", 50, 1, 0, 1, 1)
/datum/belly/proc/relaymove(var/mob/living/R)
var/struggle_outer_message = pick(struggle_messages_outside)
var/struggle_user_message = pick(struggle_messages_inside)
var/strpick = pick(struggle_sounds)
var/strsound = struggle_sounds[strpick]
if(escapable && R.a_intent != "help") //If the stomach has escapable enabled and the person is actually trying to kick out
R << "<span class='warning'>You attempt to climb out of \the [name].</span>"
owner << "<span class='warning'>Someone is attempting to climb out of your [name]!</span>"
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
if(do_after(R, escapetime))
if((escapable) && (R in internal_contents)) //Does the owner still have escapable enabled?
release_specific_contents(R)
R << "<span class='warning'>You climb out of \the [name].</span>"
owner << "<span class='warning'>[R] climbs out of your [name]!</span>"
for(var/mob/M in hearers(4, owner))
M.visible_message("<span class='warning'>[R] climbs out of [owner]'s [name]!</span>", 2)
return
else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable.
R << "<span class='warning'>Your attempt to escape [name] has failed!</span>"
owner << "<span class='notice'>The attempt to escape from your [name] has failed!</span>"
return
if(!(R in internal_contents) || recent_struggle)
return // User is not in this belly, or struggle too soon.
if(R in internal_contents && R.a_intent == "help")
recent_struggle = 1
spawn(30)
recent_struggle = 0
struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name))
struggle_user_message = replacetext(struggle_user_message,"%pred",owner)
struggle_user_message = replacetext(struggle_user_message,"%prey",R)
struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name))
struggle_outer_message = "<span class='alert'>" + struggle_outer_message + "</span>"
struggle_user_message = "<span class='alert'>" + struggle_user_message + "</span>"
for(var/mob/M in hearers(4, owner))
M.show_message(struggle_outer_message, 2) // hearable
R << struggle_user_message
playsound(R.loc, strsound, 50, 1)
else if(!(R in internal_contents && R.a_intent == "help"))
integrity -= 15
recent_struggle = 1
spawn(15) // there's a want to get out, so faster
recent_struggle = 0
struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name))
struggle_user_message = replacetext(struggle_user_message,"%pred",owner)
struggle_user_message = replacetext(struggle_user_message,"%prey",R)
struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name))
struggle_outer_message = "<span class='alert'>" + struggle_outer_message + "</span>"
struggle_user_message = "<span class='alert'>" + struggle_user_message + "</span>"
for(var/mob/M in hearers(4, owner))
M.show_message(struggle_outer_message, 2) // hearable
R << struggle_user_message
playsound(R.loc, strsound, 50, 1)
if(integrity<=0)
release_specific_contents(R)
integrity=0
owner.Stun(rand(2,4))
playsound(R.loc, 'sound/vore/StomachTransfer.ogg', 50, 1)
else //Nothing interesting happened.
R << "<span class='warning'>But make no progress in escaping [owner]'s [name].</span>"
owner << "<span class='warning'>But appears to be unable to make any progress in escaping your [name].</span>"
return
else
return
// Belly copies and then returns the copy
// Needs to be updated for any var changes
@@ -416,4 +366,4 @@
for(var/I in emote_lists[K])
dupe.emote_lists[K] += I
return dupe
return dupe
+17 -30
View File
@@ -12,9 +12,6 @@
M << "<span class='notice'>[pick(EL)]</span>"
src.emotePend = 0
//////////////////////////////Integrity regeneration ////////////////
integrity=min(integrity+8,100)
///////////////////////////// DM_HOLD /////////////////////////////
if(digest_mode == DM_HOLD)
return //Pretty boring, huh
@@ -23,9 +20,7 @@
if(digest_mode == DM_DIGEST)
if(prob(50))
var/churnsound = pick(digestion_sounds)
for(var/mob/hearer in range(1,owner))
hearer << sound(churnsound,volume=60)
playsound(owner.loc, "digestion_sounds", 65, 1, 0, 1, 1)
for (var/mob/living/M in internal_contents)
//Pref protection!
@@ -33,7 +28,7 @@
continue
//Person just died in guts!
if(M.stat == DEAD && M.getFireLoss() >= 150)
if(M.stat == DEAD)
var/digest_alert_owner = pick(digest_messages_owner)
var/digest_alert_prey = pick(digest_messages_prey)
@@ -51,26 +46,23 @@
M << "<span class='notice'>" + digest_alert_prey + "</span>"
owner.nutrition += 400 // so eating dead mobs gives you *something*.
var/deathsound = pick(death_sounds)
for(var/mob/hearer in range(1,owner))
hearer << deathsound
playsound(owner.loc, "death_gurgles", 70, 1, 0, 1, 1)
digestion_death(M)
owner.update_icons()
continue
// Deal digestion damage (and feed the pred)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
owner.nutrition += 10
owner.nutrition += 1
return
//////////////////////////// DM_DIGESTF ////////////////////////////
if(digest_mode == DM_DIGESTF)
if(prob(50))
var/churnsound = pick(digestion_sounds)
for(var/mob/hearer in range(1,owner))
hearer << sound(churnsound,volume=80)
playsound(owner.loc, "digestion_sounds", 65, 1, 0, 1, 1)
for (var/mob/living/M in internal_contents)
//Pref protection!
@@ -78,7 +70,7 @@
continue
//Person just died in guts!
if(M.stat == DEAD && M.getFireLoss() >= 150)
if(M.stat == DEAD)
var/digest_alert_owner = pick(digest_messages_owner)
var/digest_alert_prey = pick(digest_messages_prey)
@@ -96,32 +88,27 @@
M << "<span class='notice'>" + digest_alert_prey + "</span>"
owner.nutrition += 400 // so eating dead mobs gives you *something*.
var/deathsound = pick(death_sounds)
for(var/mob/hearer in range(1,owner))
hearer << deathsound
playsound(owner.loc, "death_gurgles", 70, 1, 0, 1, 1)
digestion_death(M)
owner.update_icons()
continue
// Deal digestion damage (and feed the pred)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(2)
M.adjustFireLoss(3)
owner.nutrition += 10
owner.nutrition += 1
return
///////////////////////////// DM_HEAL /////////////////////////////
if(digest_mode == DM_HEAL)
if(prob(50)) //Wet heals!
var/healsound = pick(digestion_sounds)
for(var/mob/hearer in range(1,owner))
hearer << sound(healsound,volume=80)
if(prob(50))
playsound(owner.loc, "digestion_sounds", 50, 1, 0, 1, 1)
for (var/mob/living/M in internal_contents)
if(M.stat != DEAD)
if(owner.nutrition > 90 && (M.health < M.maxHealth))
M.adjustBruteLoss(-2)
M.adjustFireLoss(-2)
owner.nutrition -= 2
if(M.nutrition <= 400)
M.nutrition += 1
if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
owner.nutrition -= 10
return
+11 -139
View File
@@ -3,56 +3,8 @@
var/digestable = 1 // Can the mob be digested inside a belly?
var/datum/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/recent_struggle = 0
//
// Hook for generic creation of stuff on new creatures
//
/hook/living_new/proc/vore_setup(mob/living/M)
M.verbs += /mob/living/proc/insidePanel
M.verbs += /mob/living/proc/escapeOOC
//Tries to load prefs if a client is present otherwise gives freebie stomach
if(!M.vore_organs || !M.vore_organs.len)
spawn(20) //Wait a couple of seconds to make sure copy_to or whatever has gone
if(!M) return
/* if(M.client && M.client.prefs)
if(!M.load_vore_preferences)
M << "<span class='warning'>ERROR: You seem to have saved prefs, but they couldn't be loaded.</span>"
return 0
if(M.vore_organs && M.vore_organs.len)
M.vore_selected = M.vore_organs[1] */
if(!M.vore_organs || !M.vore_organs.len)
if(!M.vore_organs)
M.vore_organs = list()
var/datum/belly/B = new /datum/belly(M)
B.immutable = 1
B.name = "Stomach"
B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]."
M.vore_organs[B.name] = B
M.vore_selected = B.name
//Simple_animal gets emotes. move this to that hook instead?
if(istype(src,/mob/living/simple_animal))
B.emote_lists[DM_HOLD] = list(
"The insides knead at you gently for a moment.",
"The guts glorp wetly around you as some air shifts.",
"Your predator takes a deep breath and sighs, shifting you somewhat.",
"The stomach squeezes you tight for a moment, then relaxes.",
"During a moment of quiet, breathing becomes the most audible thing.",
"The warm slickness surrounds and kneads on you.")
B.emote_lists[DM_DIGEST] = list(
"The caustic acids eat away at your form.",
"The acrid air burns at your lungs.",
"Without a thought for you, the stomach grinds inwards painfully.",
"The guts treat you like food, squeezing to press more acids against you.",
"The onslaught against your body doesn't seem to be letting up; you're food now.",
"The insides work on you like they would any other food.")
//Return 1 to hook-caller
return 1
var/devourable = 0 // Can the mob be vored at all?
// var/feeding = 0 // Are we going to feed someone else?
//
// Handle being clicked, perhaps with something to devour
@@ -74,7 +26,7 @@
user << "<span class='notice'>They aren't voracious enough.</span>"
feed_self_to_grabbed(user)
if( user == src ) //you click yourself
if(user == src) //you click yourself
if(!is_vore_predator(src))
user << "<span class='notice'>You aren't voracious enough.</span>"
feed_grabbed_to_self(prey, user)
@@ -104,7 +56,7 @@
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
return//disabled until further notice
return//disabled until I can make that toggle work
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, prey, pred, belly)
@@ -115,7 +67,9 @@
/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 100)
//Sanity
if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
log_attack("[user] attempted to feed [prey] to [pred], via [belly] but it went wrong.")
return
if (!prey.devourable)
user << "This can't be eaten!"
return
// The belly selected at the time of noms
var/datum/belly/belly_target = pred.vore_organs[belly]
@@ -136,7 +90,7 @@
// Now give the prey time to escape... return if they did
if(!do_mob(src, user, swallow_time))
return 0 // Prey escpaed (or user disabled) before timer expired.
return 0 // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
@@ -212,12 +166,11 @@
return 0
//
// Proc for updating vore organs and digestion/healing/absorbing
//
/mob/living/proc/handle_internal_contents()
if(SSair.times_fired%3 != 1)
if(SSmob.times_fired%6==1)
return //The accursed timer
for (var/I in vore_organs)
@@ -225,95 +178,14 @@
if(B.internal_contents.len)
B.process_Life() //AKA 'do bellymodes_vr.dm'
if(SSair.times_fired%3 != 1) return //Occasionally do supercleanups.
for (var/I in vore_organs)
var/datum/belly/B = vore_organs[I]
if(B.internal_contents.len)
listclearnulls(B.internal_contents)
for(var/atom/movable/M in B.internal_contents)
if(M.loc != src)
B.internal_contents -= M
log_attack("Had to remove [M] from belly [B] in [src]")
/*
//
// Verb for saving vore preferences to save file
//
/mob/living/proc/save_vore_prefs()
if(!(client || client.prefs_vr))
return 0
if(!copy_to_prefs_vr())
return 0
if(!client.prefs_vr.save_vore())
return 0
B.internal_contents.Remove(M)
return 1
/mob/living/proc/apply_vore_prefs()
if(!(client || client.prefs_vr))
return 0
if(!client.prefs_vr.load_vore())
return 0
if(!copy_from_prefs_vr())
return 0
return 1
/mob/living/proc/copy_to_prefs_vr()
if(!client || !client.prefs_vr)
src << "<span class='warning'>You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>"
return 0
var/datum/vore_preferences/P = client.prefs_vr
P.digestable = src.digestable
P.belly_prefs = src.vore_organs
return 1
//
// Proc for applying vore preferences, given bellies
//
/mob/living/proc/copy_from_prefs_vr()
if(!client || !client.prefs_vr)
src << "<span class='warning'>You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>"
return 0
var/datum/vore_preferences/P = client.prefs_vr
src.digestable = P.digestable
src.vore_organs = list()
for(var/I in P.belly_prefs)
var/datum/belly/Bp = P.belly_prefs[I]
src.vore_organs[Bp.name] = Bp.copy(src)
return 1
*/
//
// Verb for saving vore preferences to save file
//
/mob/living/proc/save_vore_prefs()
set name = "Save Vore Prefs"
set category = "Vore"
var/result = 0
if(client.prefs)
result = client.prefs.save_vore_preferences()
else
src << "<span class='warning'>You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.</span>"
log_admin("[src] tried to save vore prefs but lacks a client.prefs var.")
return result
//
// Proc for applying vore preferences, given bellies
//
/mob/living/proc/apply_vore_prefs(var/list/bellies)
if(!bellies || bellies.len == 0)
log_admin("Tried to apply bellies to [src] and failed.")
//
// OOC Escape code for pref-breaking or AFK preds
//
/mob/living/proc/escapeOOC()
+23 -72
View File
@@ -19,43 +19,11 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
-Aro <3 */
//
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
// the object they are overriding. So all /mob/living together, etc.
//
/datum/configuration
var/items_survive_digestion = 1 //For configuring if the important_items survive digestion
/*
//
// The datum type bolted onto normal preferences datums for storing Virgo stuff
//
/client
var/datum/vore_preferences/prefs_vr
/hook/client_new/proc/add_prefs_vr(client/C)
C.prefs_vr = new/datum/vore_preferences(C)
if(C.prefs_vr)
return 1
return 0
/datum/vore_preferences
//Actual preferences
/datum/preferences
var/digestable = 1
var/devourable = 1
var/list/belly_prefs = list()
//Mechanically required
var/path
var/slot
var/client/client
var/client_ckey
/datum/vore_preferences/New(client/C)
if(istype(C))
client = C
client_ckey = C.ckey
load_vore_preferences(C)
*/
//
// Check if an object is capable of eating things, based on vore_organs
//
@@ -63,14 +31,15 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
if(istype(O,/mob/living))
if(O.vore_organs.len > 0)
return 1
// verbs -= /mob/living/proc/insidePanel
// verbs -= /mob/living/proc/escapeOOC
return 0
//
// Belly searching for simplifying other procs
//
/proc/check_belly(atom/movable/A)
if(istype(A.loc,/mob/living))
if(ismob(A.loc))
var/mob/living/M = A.loc
for(var/I in M.vore_organs)
var/datum/belly/B = M.vore_organs[I]
@@ -79,45 +48,27 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
return 0
/*
// Save/Load Vore Preferences
//
/datum/preferences/proc/load_vore()
if(!client || !client_ckey) return 0 //No client, how can we save?
// Verb for saving vore preferences to save file
//
/mob/living/proc/save_vore_prefs()
set name = "Save Vore Prefs"
set category = "Vore"
slot = client.prefs.default_slot
var/result = 0
path = client.prefs.path
if(client.prefs)
result = client.prefs.save_vore_preferences()
else
src << "<span class='warning'>You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.</span>"
log_admin("[src] tried to save vore prefs but lacks a client.prefs var.")
if(!path) return 0 //Path couldn't be set?
if(!fexists(path)) //Never saved before
save_vore() //Make the file first
return 1
return result
var/savefile/S = new /savefile(path)
if(!S) return 0 //Savefile object couldn't be created?
//
// Proc for applying vore preferences, given bellies
//
/mob/living/proc/apply_vore_prefs(var/list/bellies)
if(!bellies || bellies.len == 0)
log_admin("Tried to apply bellies to [src] and failed.")
S.cd = "/character[slot]"
S["digestable"] >> digestable
S["belly_prefs"] >> belly_prefs
if(isnull(digestable))
digestable = 1
if(isnull(belly_prefs))
belly_prefs = list()
return 1
/datum/preferences/proc/save_vore()
if(!path) return 0
if(!slot) return 0
var/savefile/S = new /savefile(path)
if(!S) return 0
S.cd = "/character[slot]"
S["digestable"] << digestable
S["belly_prefs"] << belly_prefs
return 1
*/
+30 -8
View File
@@ -12,7 +12,7 @@
var/dat = picker_holder.gen_vui(src)
picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder)
picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
@@ -63,6 +63,7 @@
dat += "<ol style='list-style: none; padding: 0; overflow: auto;'>"
for(var/K in user.vore_organs) //Fuggin can't iterate over values
var/datum/belly/B = user.vore_organs[K]
B.owner = user
if(B == selected)
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'><b>[B.name]</b>"
else
@@ -75,7 +76,7 @@
if(DM_DIGEST)
spanstyle = "color:red;"
if(DM_DIGESTF)
spanstyle = "color:red;"
spanstyle = "color:purple;"
if(DM_HEAL)
spanstyle = "color:green;"
@@ -139,6 +140,12 @@
if(0)
dat += "<a href='?src=\ref[src];toggledg=1'><span style='color:green;'>Toggle Digestable</span></a>"
switch(user.devourable)
if(1)
dat += "<a href='?src=\ref[src];toggledvor=1'>Toggle Devourable</a>"
if(0)
dat += "<a href='?src=\ref[src];toggledvor=1'><span style='color:green;'>Toggle Devourable</span></a>"
//Returns the dat html to the vore_look
return dat
@@ -228,6 +235,7 @@
selected.release_all_contents()
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.loc << "<span class='danger'>Everything is released from [user]!</span>"
if("Move all")
if(user.stat)
@@ -265,6 +273,7 @@
selected.release_specific_contents(tgt)
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.loc << "<span class='danger'>[tgt] is released from [user]!</span>"
if("Move")
if(user.stat)
@@ -299,6 +308,7 @@
var/datum/belly/NB = new(user)
NB.name = new_name
NB.owner = user //might be the thing we all needed.
user.vore_organs[new_name] = NB
selected = NB
@@ -433,13 +443,14 @@
user.vore_selected = user.vore_organs[1]
if(href_list["saveprefs"])
if(!user.save_vore_prefs())
user << "<span class='warning'>ERROR: Preferences failed to save!</span>"
if(user.save_vore_prefs())
user << "<span class='notice'>Saved belly preferences.</span>"
else
user << "<span class='notice'>Preferences saved!</span>"
user << "<span class='warning'>ERROR: Could not save vore prefs.</span>"
log_admin("Could not save vore prefs on USER: [user].")
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Don't abuse this button by toggling it back and forth to extend a scene or whatever, or you'll make the admins cry. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
switch(choice)
if("Cancel")
return 1
@@ -448,10 +459,21 @@
if("Prevent Digestion")
user.digestable = 0
// message_admins("[key_name(user)] toggled their digestability to [user.digestable] ([user ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[user.loc.];Y=[user.loc.y];Z=[user.loc.z]'>JMP</a>" : "null"])")
if(user.client.prefs)
user.client.prefs.digestable = user.digestable
if(href_list["toggledvor"])
var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
switch(choice)
if("Cancel")
return 1
if("Allow Devourment")
user.devourable = 1
if("Prevent Devourment")
user.devourable = 0
if(user.client.prefs)
user.client.prefs.devourable = user.devourable
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return 1
+3 -1
View File
@@ -13,8 +13,10 @@
/hook/simple_animal_new
/hook/preferences_new
//Hooks for interactions
/hook/living_attackby
//hook/living_attackby
//
//Hook helpers to expand hooks to others
+79 -68
View File
@@ -1,16 +1,16 @@
//these aren't defines so they can stay in this file
var/const/RESIZE_HUGE = 2
var/const/RESIZE_BIG = 1.5
var/const/RESIZE_NORMAL = 1
var/const/RESIZE_SMALL = 0.5
var/const/RESIZE_TINY = 0.25
var/const/SIZESCALE_HUGE = 2
var/const/SIZESCALE_BIG = 1.5
var/const/SIZESCALE_NORMAL = 1
var/const/SIZESCALE_SMALL = 0.85
var/const/SIZESCALE_TINY = 0.60
//average
var/const/RESIZE_A_HUGEBIG = (RESIZE_HUGE + RESIZE_BIG) / 2
var/const/RESIZE_A_BIGNORMAL = (RESIZE_BIG + RESIZE_NORMAL) / 2
var/const/RESIZE_A_NORMALSMALL = (RESIZE_NORMAL + RESIZE_SMALL) / 2
var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
var/const/SIZESCALE_A_HUGEBIG = (SIZESCALE_HUGE + SIZESCALE_BIG) / 2
var/const/SIZESCALE_A_BIGNORMAL = (SIZESCALE_BIG + SIZESCALE_NORMAL) / 2
var/const/SIZESCALE_A_NORMALSMALL = (SIZESCALE_NORMAL + SIZESCALE_SMALL) / 2
var/const/SIZESCALE_A_SMALLTINY = (SIZESCALE_SMALL + SIZESCALE_TINY) / 2
// Adding needed defines to /mob/living
// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff.
@@ -23,13 +23,13 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
/**
* Scale up the size of a mob's icon by the size_multiplier.
* NOTE: mob/living/carbon/human/update_icons() has a more complicated system and
* NOTE: mob/living/carbon/human/update_transform() has a more complicated system and
* is already applying this transform. BUT, it does not call ..()
* as long as that is true, we should be fine. If that changes we need to
* re-evaluate.
*/
/mob/living/update_icons()
// ASSERT(!iscarbon(src))
/mob/living/update_transform()
ASSERT(!iscarbon(src))
var/matrix/M = matrix()
M.Scale(size_multiplier)
M.Translate(0, 16*(size_multiplier-1))
@@ -48,21 +48,20 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
* Resizes the mob immediately to the desired mod, animating it growing/shrinking.
* It can be used by anything that calls it.
*/
/mob/living/proc/resize(var/new_size)
var/matrix/resize = matrix() // Defines the matrix to change the player's size
resize.Scale(new_size) //Change the size of the matrix
/mob/living/proc/sizescale(var/new_size)
var/matrix/sizescale = matrix() // Defines the matrix to change the player's size
sizescale.Scale(new_size) //Change the size of the matrix
if(new_size >= RESIZE_NORMAL)
resize.Translate(0, -1 * (1 - new_size) * 16) //Move the player up in the tile so their feet align with the bottom
if(new_size >= SIZESCALE_NORMAL)
sizescale.Translate(0, -1 * (1 - new_size) * 16) //Move the player up in the tile so their feet align with the bottom
animate(src, transform = resize, time = 5) //Animate the player resizing
animate(src, transform = sizescale, time = 5) //Animate the player resizing
size_multiplier = new_size //Change size_multiplier so that other items can interact with them
/**
/*
* Verb proc for a command that lets players change their size OOCly.
* Ace was here! Redid this a little so we'd use math for shrinking characters. This is the old code.
*/
/*
/mob/living/proc/set_size()
set name = "Set Character Size"
set category = "Vore"
@@ -73,19 +72,19 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
var/size_name = input(nagmessage, "Pick a Size") in player_sizes_list
if (size_name && player_sizes_list[size_name])
src.resize(player_sizes_list[size_name])
message_admins("[key_name(src)] used the resize command in-game to be [size_name]. \
src.sizescale(player_sizes_list[size_name])
message_admins("[key_name(src)] used the sizescale command in-game to be [size_name]. \
([src ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>" : "null"])")
/** Add the set_size() proc to usable verbs. */
/hook/living_new/proc/resize_setup(mob/living/M)
/hook/living_new/proc/sizescale_setup(mob/living/M)
M.verbs += /mob/living/proc/set_size
return 1
/**
* Attempt to scoop up this mob up into M's hands, if the size difference is large enough.
* @return false if normal code should continue, 1 to prevent normal code.
*/
/mob/living/proc/attempt_to_scoop(var/mob/living/carbon/human/M)
if(!istype(M))
return 0;
@@ -99,33 +98,40 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
else
return 0; // Unable to scoop, let other code run
*/
/**
/*
* Handle bumping into someone with helping intent.
* Called from /mob/living/Bump() in the 'brohugs all around' section.
* @return false if normal code should continue, 1 to prevent normal code.
* // TODO - can the now_pushing = 0 be moved up? What does it do anyway?
*/
/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob)
if(src.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY)
if(src.get_effective_size() <= SIZESCALE_A_SMALLTINY && tmob.get_effective_size() <= SIZESCALE_A_SMALLTINY)
// Both small! Go ahead and
now_pushing = 0
src.forceMove(tmob.loc)
return 1
if(abs(src.get_effective_size() - tmob.get_effective_size()) >= 0.75)
if(abs(src.get_effective_size() - tmob.get_effective_size()) >= 0.20)
now_pushing = 0
src.forceMove(tmob.loc)
if(src.get_effective_size() > tmob.get_effective_size())
// var/mob/living/carbon/human/M = src
// if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
// src << "You carefully slither around [tmob]."
// tmob << "[src]'s huge tail slithers past beside you!"
// else
/* var/mob/living/carbon/human/tmob = src
if(istype(tmob) && istype(tmob.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully slither around [tmob]."
M << "[src]'s huge tail slithers past beside you!"
else
*/
src.forceMove(tmob.loc)
src << "You carefully step over [tmob]."
tmob << "[src] steps over you carefully!"
if(tmob.get_effective_size() > src.get_effective_size())
// var/mob/living/carbon/human/M = tmob
// if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
// src << "You jump over [tmob]'s thick tail."
// tmob << "[src] bounds over your tail."
// else
/* var/mob/living/carbon/human/M = M
if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You jump over [M]'s thick tail."
M << "[src] bounds over your tail."
else
*/
src.forceMove(tmob.loc)
src << "You run between [tmob]'s legs."
tmob << "[src] runs between your legs."
return 1
@@ -138,58 +144,63 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
* @return false if normal code should continue, 1 to prevent normal code.
*/
/mob/living/proc/handle_micro_bump_other(var/mob/living/tmob)
ASSERT(istype(tmob)) // Baby don't hurt me
ASSERT(isliving(tmob)) // Baby don't hurt me
if(src.a_intent == "disarm" && src.canmove && !src.buckled)
// If bigger than them by at least 0.75, move onto them and print message.
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75)
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.20)
now_pushing = 0
src.forceMove(tmob.loc)
tmob.Stun(4)
// var/mob/living/carbon/human/M = src
// if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
// src << "You carefully squish [tmob] under your tail!"
// tmob << "[src] pins you under their tail!"
// else
/*
var/mob/living/carbon/human/H = src
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully squish [tmob] under your tail!"
tmob << "[src] pins you under their tail!"
else
*/
src << "You pin [tmob] beneath your foot!"
tmob << "[src] pins you beneath their foot!"
return 1
if(src.a_intent == "harm" && src.canmove && !src.buckled)
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75)
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.20)
now_pushing = 0
src.forceMove(tmob.loc)
tmob.adjustStaminaLoss(15)
tmob.adjustBruteLoss(2)
// var/mob/living/carbon/human/M = src
// if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
// src << "You steamroller over [tmob] with your heavy tail!"
// tmob << "[src] ploughs you down mercilessly with their heavy tail!"
// else
tmob.adjustStaminaLoss(35)
tmob.adjustBruteLoss(5)
/* var/mob/living/carbon/human/M = src
if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You steamroller over [tmob] with your heavy tail!"
tmob << "[src] ploughs you down mercilessly with their heavy tail!"
else
*/
src << "You bring your foot down heavily upon [tmob]!"
tmob << "[src] steps carelessly on your body!"
return 1
/*
if(src.a_intent == "grab" && src.canmove && !src.buckled)
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75)
now_pushing = 0
src.forceMove(tmob.loc)
// until I figure out grabbing micros with the godawful pull code...
if(src.a_intent == "grab" && src.canmove && !src.buckled)
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.20)
now_pushing = 0
tmob.adjustStaminaLoss(15)
src.forceMove(tmob.loc)
src << "You press [tmob] beneath your foot!"
tmob << "[src] presses you beneath their foot!"
/*
var/mob/living/carbon/human/M = src
if(istype(M) && !M.shoes)
// User is a human (capable of scooping) and not wearing shoes! Scoop into foot slot!
equip_to_slot_if_possible(tmob.get_scooped(M), slot_shoes, 0, 1)
// if(istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
// src << "You wrap up [tmob] with your powerful tail!"
// tmob << "[src] binds you with their powerful tail!"
// else
if(istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You wrap up [tmob] with your powerful tail!"
tmob << "[src] binds you with their powerful tail!"
else
src << "You clench your toes around [tmob]'s body!"
tmob << "[src] grabs your body with their toes!"
// else if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
// src << "You carefully squish [tmob] under your tail!"
// tmob << "[src] pins you under their tail!"
else if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully squish [tmob] under your tail!"
tmob << "[src] pins you under their tail!"
else
src << "You pin [tmob] beneath your foot!"
tmob << "[src] pins you beneath their foot!"
+115
View File
@@ -0,0 +1,115 @@
////////////////////////////
/// shrinking serum ///
////////////////////////////
/datum/reagent/medicine/macrocillin
name = "Macrocillin"
id = "macrocillin"
description = "Glowing yellow liquid."
reagent_state = LIQUID
color = "#FFFF00" // rgb: 255, 255, 0
overdose_threshold = 20
/datum/reagent/medicine/macrocillin/on_mob_life(mob/living/M, method=INGEST)
for(var/size in list(SIZESCALE_SMALL, SIZESCALE_NORMAL, SIZESCALE_BIG, SIZESCALE_HUGE))
if(M.size_multiplier < size)
M.sizescale(size)
M << "<font color='green'>You grow!</font>"
break
if(M.reagents.has_reagent("macrocillin"))
M.reagents.remove_reagent("macrocillin", 20)
..()
/datum/reagent/medicine/microcillin
name = "Microcillin"
id = "microcillin"
description = "Murky purple liquid."
reagent_state = LIQUID
color = "#800080"
overdose_threshold = 20
/datum/reagent/microcillin/on_mob_life(mob/living/M, method=INGEST)
for(var/size in list(SIZESCALE_BIG, SIZESCALE_NORMAL, SIZESCALE_SMALL, SIZESCALE_TINY))
if(M.size_multiplier > size)
M.sizescale(size)
M << "<span class='alert'>You shrink!</span>"
break;
if(M.reagents.has_reagent("microcillin"))
M.reagents.remove_reagent("microcillin", 20)
..()
/datum/reagent/medicine/normalcillin
name = "Normalcillin"
id = "normalcillin"
description = "Translucent cyan liquid."
reagent_state = LIQUID
color = "#00FFFF"
overdose_threshold = 20
/datum/reagent/medicine/normalcillin/on_mob_life(mob/living/M, method=INGEST)
if(M.size_multiplier > SIZESCALE_BIG)
M.sizescale(SIZESCALE_BIG)
M << "<span class='alert'>You shrink!</span>"
else if(M.size_multiplier > SIZESCALE_NORMAL)
M.sizescale(SIZESCALE_NORMAL)
M << "<span class='alert'>You shrink!</span>"
else if(M.size_multiplier < SIZESCALE_NORMAL)
M.sizescale(SIZESCALE_NORMAL)
M << "<font color='green'>You grow!</font>"
else if(M.size_multiplier < SIZESCALE_SMALL)
M.sizescale(SIZESCALE_SMALL)
M << "<font color='green'>You grow!</font>"
if(M.reagents.has_reagent("normalcillin"))
M.reagents.remove_reagent("normalcillin", 20)
..()
/datum/reagent/medicine/sizeoxadone
name = "Sizeoxadone"
id = "sizeoxadone"
description = "A volatile liquid used as a precursor to size-altering chemicals. Causes dizziness if taken unprocessed."
reagent_state = LIQUID
color = "#1E90FF"
overdose_threshold = 30
metabolization_rate = 0.8 * REAGENTS_METABOLISM
/datum/reagent/sizeoxadone/on_mob_life(var/mob/living/carbon/M, var/removed)
if(M.hallucination < volume && prob(20))
M.hallucination += 5
if(!M.confused) M.confused = 1
M.confused = max(M.confused, 20)
return
/datum/reagent/medicine/sizeoxadone/overdose_process(mob/living/M)
M.adjustBrainLoss(1)
M.adjustToxLoss(1)
..()
. = 1
////////////////////////// Anti-Noms Drugs //////////////////////////
/datum/reagent/medicine/ickypak
name = "Ickypak"
id = "ickypak"
description = "A foul-smelling green liquid, for inducing muscle contractions to expel accidentally ingested things."
reagent_state = LIQUID
color = "#0E900E"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
/datum/reagent/medicine/ickypak/on_mob_life(var/mob/living/M, method=INGEST)
..()
if(M.hallucination < volume && prob(20))
M.hallucination += 5
M.adjustToxLoss(-5)
for(var/I in M.vore_organs)
var/datum/belly/B = M.vore_organs[I]
for(var/atom/movable/A in B.internal_contents)
if(prob(55))
playsound(M, 'sound/effects/splat.ogg', 50, 1)
B.release_specific_contents(A)
..()
. = 1
+109 -20
View File
@@ -1,7 +1,7 @@
//
// Size Gun
//
/*
/obj/item/weapon/gun/energy/sizegun
name = "shrink ray"
desc = "A highly advanced ray gun with two settings: Shrink and Grow. Warning: Do not insert into mouth."
@@ -13,7 +13,7 @@
projectile_type = /obj/item/projectile/beam/shrinklaser
origin_tech = "redspace=1;bluespace=4"
modifystate = "sizegun-shrink"
self_recharge = 1
selfcharge = 1
firemodes = list(
list(mode_name = "grow",
projectile_type = /obj/item/projectile/beam/growlaser,
@@ -29,6 +29,7 @@
//
// Beams for size gun
//
// tracers TBD
/obj/item/projectile/beam/shrinklaser
name = "shrink beam"
@@ -45,15 +46,15 @@
if(istype(target, /mob/living))
var/mob/living/M = target
switch(M.size_multiplier)
if(RESIZE_HUGE to INFINITY)
M.resize(RESIZE_BIG)
if(RESIZE_BIG to RESIZE_HUGE)
M.resize(RESIZE_NORMAL)
if(RESIZE_NORMAL to RESIZE_BIG)
M.resize(RESIZE_SMALL)
if((0 - INFINITY) to RESIZE_NORMAL)
M.resize(RESIZE_TINY)
M.update_icons()
if(SIZESCALE_HUGE to INFINITY)
M.sizescale(SIZESCALE_BIG)
if(SIZESCALE_BIG to SIZESCALE_HUGE)
M.sizescale(SIZESCALE_NORMAL)
if(SIZESCALE_NORMAL to SIZESCALE_BIG)
M.sizescale(SIZESCALE_SMALL)
if((0 - INFINITY) to SIZESCALE_NORMAL)
M.sizescale(SIZESCALE_TINY)
M.update_transform()
return 1
/obj/item/projectile/beam/growlaser
@@ -71,13 +72,101 @@
if(istype(target, /mob/living))
var/mob/living/M = target
switch(M.size_multiplier)
if(RESIZE_BIG to RESIZE_HUGE)
M.resize(RESIZE_HUGE)
if(RESIZE_NORMAL to RESIZE_BIG)
M.resize(RESIZE_BIG)
if(RESIZE_SMALL to RESIZE_NORMAL)
M.resize(RESIZE_NORMAL)
if((0 - INFINITY) to RESIZE_TINY)
M.resize(RESIZE_SMALL)
M.update_icons()
if(SIZESCALE_BIG to SIZESCALE_HUGE)
M.sizescale(SIZESCALE_HUGE)
if(SIZESCALE_NORMAL to SIZESCALE_BIG)
M.sizescale(SIZESCALE_BIG)
if(SIZESCALE_SMALL to SIZESCALE_NORMAL)
M.sizescale(SIZESCALE_NORMAL)
if((0 - INFINITY) to SIZESCALE_TINY)
M.sizescale(SIZESCALE_SMALL)
M.update_transform()
return 1
*/
datum/design/sizeray
name = "Size Ray"
desc = "Abuse bluespace tech to alter living matter scale."
id = "sizeray"
req_tech = list("combat" = 5, "materials" = 4, "engineering" = 5, "bluespace" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 1000, MAT_DIAMOND = 2500, MAT_URANIUM = 2500, MAT_TITANIUM = 1000)
build_path = /obj/item/weapon/gun/energy/laser/sizeray
category = list("Weapons")
/obj/item/projectile/sizeray
name = "sizeray beam"
icon_state = "omnilaser"
hitsound = null
damage = 0
damage_type = STAMINA
flag = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
/obj/item/projectile/sizeray/shrinkray
icon_state="bluelaser"
/obj/item/projectile/sizeray/growthray
icon_state="laser"
/obj/item/projectile/sizeray/shrinkray/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living))
var/mob/living/M = target
switch(M.size_multiplier)
if(SIZESCALE_HUGE to INFINITY)
M.sizescale(SIZESCALE_BIG)
if(SIZESCALE_BIG to SIZESCALE_HUGE)
M.sizescale(SIZESCALE_NORMAL)
if(SIZESCALE_NORMAL to SIZESCALE_BIG)
M.sizescale(SIZESCALE_SMALL)
if((0 - INFINITY) to SIZESCALE_NORMAL)
M.sizescale(SIZESCALE_TINY)
M.update_transform()
return 1
/obj/item/projectile/sizeray/growthray/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living))
var/mob/living/M = target
switch(M.size_multiplier)
if(SIZESCALE_BIG to SIZESCALE_HUGE)
M.sizescale(SIZESCALE_HUGE)
if(SIZESCALE_NORMAL to SIZESCALE_BIG)
M.sizescale(SIZESCALE_BIG)
if(SIZESCALE_SMALL to SIZESCALE_NORMAL)
M.sizescale(SIZESCALE_NORMAL)
if((0 - INFINITY) to SIZESCALE_TINY)
M.sizescale(SIZESCALE_SMALL)
M.update_transform()
return 1
/obj/item/ammo_casing/energy/laser/growthray
projectile_type = /obj/item/projectile/sizeray/growthray
select_name = "Growth"
/obj/item/ammo_casing/energy/laser/shrinkray
projectile_type = /obj/item/projectile/sizeray/shrinkray
select_name = "Shrink"
//Gun here
/obj/item/weapon/gun/energy/laser/sizeray
name = "size ray"
icon_state = "bluetag"
desc = "Size manipulator using bluespace breakthroughs."
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray, /obj/item/ammo_casing/energy/laser/growthray)
origin_tech = "combat=1;magnets=2"
selfcharge = 1
charge_delay = 5
ammo_x_offset = 2
clumsy_check = 1
attackby(obj/item/W, mob/user)
if(W==src)
if(icon_state=="bluetag")
icon_state="redtag"
ammo_type = list(/obj/item/ammo_casing/energy/laser/growthray)
else
icon_state="bluetag"
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray)
return ..()
+2 -2
View File
@@ -45,14 +45,14 @@ The hooks you're calling should return nonzero values on success.
try
var/hook_path = text2path("/hook/[hook]")
if(!hook_path)
// error("hook_vr: Invalid hook '/hook/[hook]' called.")
// error("hook_vr: Invalid hook '/hook/[hook]' called.")
return 0
var/caller = new hook_path
var/status = 1
for(var/P in typesof("[hook_path]/proc"))
if(!call(caller, P)(arglist(args)))
// error("hook_vr: Hook '[P]' failed or runtimed.")
// error("hook_vr: Hook '[P]' failed or runtimed.")
status = 0
return status