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
This commit is contained in:
@@ -105,6 +105,10 @@ var/list/preferences_datums = list()
|
||||
//var/metadata = ""
|
||||
var/flavor_text = ""
|
||||
|
||||
// Vore prefs
|
||||
var/digestable = 1
|
||||
var/list/belly_prefs = list()
|
||||
|
||||
var/unlock_content = 0
|
||||
|
||||
var/list/ignoring = list()
|
||||
@@ -123,6 +127,8 @@ var/list/preferences_datums = list()
|
||||
var/loaded_preferences_successfully = load_preferences()
|
||||
if(loaded_preferences_successfully)
|
||||
if(load_character())
|
||||
if(load_vore_preferences())
|
||||
return
|
||||
return
|
||||
//we couldn't load character data so just randomize the character appearance + name
|
||||
random_character() //let's create a random character then - rather than a fat, bald and naked man.
|
||||
@@ -1252,12 +1258,15 @@ var/list/preferences_datums = list()
|
||||
if("save")
|
||||
save_preferences()
|
||||
save_character()
|
||||
save_vore_preferences()
|
||||
|
||||
if("load")
|
||||
load_preferences()
|
||||
load_character()
|
||||
load_vore_preferences()
|
||||
|
||||
if("changeslot")
|
||||
load_vore_preferences(text2num(href_list["num"]))
|
||||
if(!load_character(text2num(href_list["num"])))
|
||||
random_character()
|
||||
real_name = random_unique_name(gender)
|
||||
@@ -1289,6 +1298,23 @@ var/list/preferences_datums = list()
|
||||
character.name = character.real_name
|
||||
character.flavor_text = flavor_text
|
||||
|
||||
if(!length(belly_prefs))
|
||||
var/datum/belly/B = new /datum/belly(src)
|
||||
B.immutable = 1
|
||||
B.name = "Stomach"
|
||||
B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [character]."
|
||||
belly_prefs[B.name] = B
|
||||
|
||||
character.vore_organs = belly_prefs
|
||||
|
||||
character.vore_selected = character.vore_organs[1]
|
||||
|
||||
for(var/I in character.vore_organs)
|
||||
var/datum/belly/B = character.vore_organs[I]
|
||||
B.owner = character
|
||||
|
||||
character.digestable = digestable
|
||||
|
||||
character.gender = gender
|
||||
character.age = age
|
||||
|
||||
|
||||
@@ -172,6 +172,44 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
backbag = DBACKPACK
|
||||
|
||||
|
||||
//
|
||||
// Save/Load Vore Preferences
|
||||
//
|
||||
/datum/preferences/proc/load_vore_preferences(slot)
|
||||
if(!path) return 0 //Path couldn't be set?
|
||||
if(!fexists(path)) //Never saved before
|
||||
save_vore_preferences() //Make the file first
|
||||
return 1
|
||||
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S) return 0 //Savefile object couldn't be created?
|
||||
|
||||
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_preferences()
|
||||
if(!path)
|
||||
return 0
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S)
|
||||
return 0
|
||||
S.cd = "/character[default_slot]"
|
||||
|
||||
S["digestable"] << digestable
|
||||
S["belly_prefs"] << belly_prefs
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||
if(!ckey)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
//File isn't currently being used.
|
||||
/datum/preferences
|
||||
var/biological_gender = MALE
|
||||
var/identifying_gender = MALE
|
||||
|
||||
/datum/preferences/proc/set_biological_gender(var/gender)
|
||||
biological_gender = gender
|
||||
identifying_gender = gender
|
||||
@@ -0,0 +1,54 @@
|
||||
/mob/living/carbon/human/proc/examine_nutrition()
|
||||
var/message = ""
|
||||
var/nutrition_examine = round(nutrition)
|
||||
var/t_He = "It" //capitalised for use at the start of each line.
|
||||
var/t_His = "Its"
|
||||
var/t_his = "its"
|
||||
var/t_is = "is"
|
||||
var/t_has = "has"
|
||||
switch(gender)
|
||||
if(MALE)
|
||||
t_He = "He"
|
||||
t_his = "his"
|
||||
t_His = "His"
|
||||
if(FEMALE)
|
||||
t_He = "She"
|
||||
t_his = "her"
|
||||
t_His = "Her"
|
||||
if(PLURAL)
|
||||
t_He = "They"
|
||||
t_his = "their"
|
||||
t_His = "Their"
|
||||
t_is = "are"
|
||||
t_has = "have"
|
||||
if(NEUTER)
|
||||
t_He = "It"
|
||||
t_his = "its"
|
||||
t_His = "Its"
|
||||
switch(nutrition_examine)
|
||||
if(0 to 49)
|
||||
message = "<span class='warning'>[t_He] [t_is] starving! You can hear [t_his] stomach snarling from across the room!</span>\n"
|
||||
if(50 to 99)
|
||||
message = "<span class='warning'>[t_He] [t_is] extremely hungry. A deep growl occasionally rumbles from [t_his] empty stomach.</span>\n"
|
||||
if(100 to 499)
|
||||
return message //Well that's pretty normal, really.
|
||||
if(500 to 864) // Fat.
|
||||
message = "[t_He] [t_has] a stuffed belly, bloated fat and round from eating too much.\n"
|
||||
if(1200 to 1934) // One person fully digested.
|
||||
message = "<span class='warning'>[t_He] [t_is] sporting a large, round, sagging stomach. It's contains at least their body weight worth of glorping slush.</span>\n"
|
||||
if(1935 to 3004) // Two people.
|
||||
message = "<span class='warning'>[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.</span>\n"
|
||||
if(3005 to 4074) // Three people.
|
||||
message = "<span class='warning'>[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move.</span>\n"
|
||||
if(4075 to 10000) // Four or more people.
|
||||
message = "<span class='warning'>[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!</span>\n"
|
||||
return message
|
||||
|
||||
/mob/living/carbon/human/proc/examine_bellies()
|
||||
var/message = ""
|
||||
|
||||
for (var/I in src.vore_organs)
|
||||
var/datum/belly/B = vore_organs[I]
|
||||
message += B.get_examine_msg()
|
||||
|
||||
return message
|
||||
@@ -367,13 +367,13 @@
|
||||
skipcatch = 1 //can't catch the now embedded item
|
||||
|
||||
return ..()
|
||||
/* Disabling this for now so it doesn't get in the way. -Cactus
|
||||
|
||||
/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0)
|
||||
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (disabilities & FAT) && ismonkey(pulling))
|
||||
devour_mob(pulling)
|
||||
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && iscarbon(pulling))
|
||||
vore_attack(user, pulling)
|
||||
else
|
||||
..()
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/grippedby(mob/living/user)
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(user)
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
if(loc)
|
||||
environment = loc.return_air()
|
||||
|
||||
if(ismob(loc)) return
|
||||
|
||||
var/datum/gas_mixture/breath
|
||||
|
||||
if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube")))
|
||||
|
||||
@@ -211,12 +211,12 @@
|
||||
/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
|
||||
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
|
||||
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0)
|
||||
// if(user == src)
|
||||
// var/mob/living/target
|
||||
// if(pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling))
|
||||
// target = pulling
|
||||
// user.vore_initiate(target,user)
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user, mob/living/target, supress_message = 0)
|
||||
|
||||
// if(grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling) && user.zone_selected == "mouth")
|
||||
// src.vore_attack(src, devour_time = 100) //It would be better to define it on this level instead of human_defense.dm, but you'd probably need to do more work down the line. ex: xeno devour code
|
||||
// return
|
||||
|
||||
if(anchored)
|
||||
return 0
|
||||
if(!user.pulling || user.pulling != src)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/mob/living/simple_animal
|
||||
// List of targets excluded (for now) from being eaten by this mob.
|
||||
var/list/prey_exclusions = list()
|
||||
@@ -22,6 +22,7 @@ var/next_mob_id = 0
|
||||
else
|
||||
living_mob_list += src
|
||||
prepare_huds()
|
||||
hook_vr("mob_new",list(src))
|
||||
..()
|
||||
|
||||
/atom/proc/prepare_huds()
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
//////////////////////////////////////////////////////
|
||||
////////////////////SUBTLE COMMAND////////////////////
|
||||
//////////////////////////////////////////////////////
|
||||
/mob
|
||||
var/use_me = 1
|
||||
|
||||
/mob/verb/me_verb_subtle(message as text) //This would normally go in say.dm
|
||||
set name = "Subtle"
|
||||
set category = "IC"
|
||||
set desc = "Emote to nearby people (and your pred/prey)"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
message = sanitize(message)
|
||||
|
||||
if(use_me)
|
||||
usr.emote_vr("me",4,message)
|
||||
else
|
||||
usr.emote_vr(message)
|
||||
|
||||
|
||||
|
||||
/mob/proc/custom_emote_vr(var/m_type=1,var/message = null) //This would normally go in emote.dm
|
||||
if(stat || !use_me && usr == src)
|
||||
src << "You are unable to emote."
|
||||
return
|
||||
|
||||
var/muzzled = is_muzzled()
|
||||
if(m_type == 2 && muzzled) return
|
||||
|
||||
var/input
|
||||
if(!message)
|
||||
input = sanitize(input(src,"Choose an emote to display.") as text|null)
|
||||
else
|
||||
input = message
|
||||
|
||||
if(input)
|
||||
message = "<B>[src]</B> <I>[input]</I>"
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
if (message)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if (!M.client)
|
||||
continue //skip monkeys and leavers
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
if(findtext(message," snores.")) //Because we have so many sleeping people.
|
||||
break
|
||||
if(M.stat == DEAD && !(M in viewers(src,null)))
|
||||
M.show_message(message, m_type)
|
||||
var/list/subtle = hearers(1,src)
|
||||
for(var/I in subtle)
|
||||
/*if(isobj(I)) //micros in hand
|
||||
spawn(0)
|
||||
if(I) //It's possible that it could be deleted in the meantime.
|
||||
var/obj/O = I
|
||||
I.show_message(src, message, 2) */
|
||||
if(ismob(I))
|
||||
var/mob/M = I
|
||||
M.show_message(message, 2)
|
||||
|
||||
|
||||
|
||||
/mob/proc/emote_vr(var/act, var/type, var/message) //This would normally go in say.dm
|
||||
if(act == "me")
|
||||
return custom_emote_vr(type, message)
|
||||
Reference in New Issue
Block a user