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:
TalkingCactus
2016-09-10 00:31:01 -04:00
committed by Poojawa
parent 315c5a4a4e
commit 9d9a93335b
87 changed files with 5041 additions and 5383 deletions

View File

@@ -1,6 +1,5 @@
// Overhauled vore system // Overhauled vore system
#define DM_HOLD "Hold"
/* #define DM_HOLD "Hold"
#define DM_DIGEST "Digest" #define DM_DIGEST "Digest"
#define DM_HEAL "Heal" #define DM_HEAL "Heal"
#define DM_ABSORB "Absorb" #define DM_ABSORB "Absorb"
@@ -8,6 +7,10 @@
#define VORE_STRUGGLE_EMOTE_CHANCE 40 #define VORE_STRUGGLE_EMOTE_CHANCE 40
// Stance for hostile mobs to be in while devouring someone.
#define HOSTILE_STANCE_EATING 99
var/global/list/player_sizes_list = list("Macro" = RESIZE_HUGE, "Big" = RESIZE_BIG, "Normal" = RESIZE_NORMAL, "Small" = RESIZE_SMALL, "Tiny" = RESIZE_TINY) var/global/list/player_sizes_list = list("Macro" = RESIZE_HUGE, "Big" = RESIZE_BIG, "Normal" = RESIZE_NORMAL, "Small" = RESIZE_SMALL, "Tiny" = RESIZE_TINY)
@@ -36,7 +39,24 @@ var/global/list/death_sounds = list(
'sound/vore/death8.ogg', 'sound/vore/death8.ogg',
'sound/vore/death9.ogg', 'sound/vore/death9.ogg',
'sound/vore/death10.ogg') 'sound/vore/death10.ogg')
*/
var/global/list/vore_sounds = list(
"Gulp" = 'sound/vore/gulp.ogg',
"Insert" = 'sound/vore/insert.ogg',
"Insertion1" = 'sound/vore/insertion1.ogg',
"Insertion2" = 'sound/vore/insertion2.ogg',
"Insertion3" = 'sound/vore/insertion3.ogg',
"Schlorp" = 'sound/vore/schlorp.ogg',
"Squish1" = 'sound/vore/squish1.ogg',
"Squish2" = 'sound/vore/squish2.ogg',
"Squish3" = 'sound/vore/squish3.ogg',
"Squish4" = 'sound/vore/squish4.ogg')
var/global/list/struggle_sounds = list(
"Squish1" = 'sound/vore/squish1.ogg',
"Squish2" = 'sound/vore/squish2.ogg',
"Squish3" = 'sound/vore/squish3.ogg',
"Squish4" = 'sound/vore/squish4.ogg')
//Species listing //Species listing

View File

@@ -0,0 +1,9 @@
//Readds quotes and apostrophes to HTML-encoded strings
/proc/readd_quotes(var/t)
var/list/repl_chars = list(""" = "\"","'" = "'")
for(var/char in repl_chars)
var/index = findtext(t, char)
while(index)
t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+5)
index = findtext(t, char)
return t

View File

@@ -0,0 +1,107 @@
/*
// Contains VOREStation type2type functions
// list2text - takes delimiter and returns text
// text2list - takes delimiter, and creates list
//
*/
// Concatenates a list of strings into a single string. A seperator may optionally be provided.
/proc/list2text(list/ls, sep)
if (ls.len <= 1) // Early-out code for empty or singleton lists.
return ls.len ? ls[1] : ""
var/l = ls.len // Made local for sanic speed.
var/i = 0 // Incremented every time a list index is accessed.
if (sep <> null)
// Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc...
#define S1 sep, ls[++i]
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
. = "[ls[++i]]" // Make sure the initial element is converted to text.
// Having the small concatenations come before the large ones boosted speed by an average of at least 5%.
if (l-1 & 0x01) // 'i' will always be 1 here.
. = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2.
if (l-i & 0x02)
. = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
if (l-i & 0x04)
. = text("[][][][][][][][][]", ., S4) // And so on....
if (l-i & 0x08)
. = text("[][][][][][][][][][][][][][][][][]", ., S4, S4)
if (l-i & 0x10)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16)
if (l-i & 0x20)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
if (l-i & 0x40)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
while (l > i) // Chomp through the rest of the list, 128 elements at a time.
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
#undef S64
#undef S16
#undef S4
#undef S1
else
// Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc...
#define S1 ls[++i]
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
. = "[ls[++i]]" // Make sure the initial element is converted to text.
if (l-1 & 0x01) // 'i' will always be 1 here.
. += S1 // Append 1 element if the remaining elements are not a multiple of 2.
if (l-i & 0x02)
. = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
if (l-i & 0x04)
. = text("[][][][][]", ., S4) // And so on...
if (l-i & 0x08)
. = text("[][][][][][][][][]", ., S4, S4)
if (l-i & 0x10)
. = text("[][][][][][][][][][][][][][][][][]", ., S16)
if (l-i & 0x20)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
if (l-i & 0x40)
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
while (l > i) // Chomp through the rest of the list, 128 elements at a time.
. = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
#undef S64
#undef S16
#undef S4
#undef S1
// Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator)
/proc/text2list(text, delimiter="\n")
var/delim_len = length(delimiter)
if (delim_len < 1)
return list(text)
. = list()
var/last_found = 1
var/found
do
found = findtext(text, delimiter, last_found, 0)
. += copytext(text, last_found, found)
last_found = found + delim_len
while (found)

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
//proc/vore_start_normal(var/method,var/mob/living/pred, var/mob/living/prey, var/headfirst=1)

View File

@@ -1,136 +0,0 @@
var/const/COLOUR_LIST_SIZE=4
proc/sanitize_colour_list(var/list/lst=null)
if(!lst||!lst.len)
lst=new/list(COLOUR_LIST_SIZE)
if(lst.len!=COLOUR_LIST_SIZE)
var/new_lst[COLOUR_LIST_SIZE]
for(var/x=1,x<=COLOUR_LIST_SIZE,x++)
new_lst[x]=lst[x]
lst=new_lst
return lst
proc/generate_colour_icon(var/fil_chk=null,var/state=null,var/list/lst=null,var/add_layer=0,var/offset_x=0,var/offset_y=0,var/overlay_only=0,var/human=0)
if(!fil_chk||!state)return null
lst=sanitize_colour_list(lst)
var/icon/chk=new/icon(fil_chk)
var/list/available_states=chk.IconStates()
var/list/rtn_lst = list()
if(!overlay_only&&available_states.Find("[state]"))
rtn_lst += image("icon"=fil_chk, "icon_state"="[state]", "pixel_y"=offset_y, "pixel_x"=offset_x, "layer"=add_layer)
var/chk_len=human ? 1 : lst.len
for(var/x=1,x<=chk_len,x++)
if(!lst[x]&&!human)continue
var/state_check="[state]_[x]"
if(x==1)
if(human)
state_check="[state]_h"
else
if(!available_states.Find("[state_check]"))
state_check="[state]_h"
if(available_states.Find("[state_check]"))
var/image/colourized = image("icon"=fil_chk, "icon_state"="[state_check]", "pixel_y"=offset_y, "pixel_x"=offset_x, "layer"=add_layer)
var/new_color = "#" + "[human ? human : lst[x]]"
colourized.color = new_color
rtn_lst += colourized
return rtn_lst
/mob/living/carbon/human/var/heterochromia=0
/datum/dna
var/mutanttail //Narky code~
var/mutantwing
var/wingcolor="FFF"
var/special_color[COLOUR_LIST_SIZE]
var/global/const/COCK_NONE=0
var/global/const/COCK_NORMAL=1
var/global/const/COCK_HYPER=2
var/global/const/COCK_DOUBLE=3
var/list/cock=list("has"=COCK_NONE,"type"="human","color"="900")
var/vagina=0
var/datum/special_mutant/special
var/taur=0 //TEMP!
var/mob/living/simple_animal/naga_segment/naga=null //ALSO TEMP!
/* proc/generateExtraData()
var/list/EDL=list(
"race"=mutantrace,
"tail"=mutanttail,
"sc"=special_color,
"cock"=cock,
"vagina"=vagina)
return EDL
proc/addExtraData(var/list/EDL, var/setit=0)
if(EDL["race"]||setit)
mutantrace=EDL["race"]
if(EDL["tail"]||setit)
mutanttail=EDL["tail"]
if(EDL["sc"]||setit)
special_color=EDL["sc"]
if(EDL["cock"]||setit)
cock=EDL["cock"]
if(!isnull(EDL["vagina"])||setit)
vagina=EDL["vagina"]*
proc/setExtraData(var/list/EDL)*/
/datum/special_mutant
proc/generate_overlay()
return 0
proc/generate_underlay()
return 0
/datum/dna/proc/mutantrace() //Easy legacy support!
if(species)
return species.id
else
return "human"
/datum/dna/proc/generate_race_block()
var/block_gen="fff"
if(species_list[mutantrace()])
//block_gen = construct_block(species_list.Find(mutantrace), species_list.len+1)
block_gen = construct_block(species_list.Find(species.id), species_list.len+1)
else
block_gen = construct_block(species_list.len+1, species_list.len+1)
return block_gen
/mob/living/proc/set_mutantrace(var/new_mutantrace=null)
new_mutantrace=kpcode_race_san(new_mutantrace)
var/datum/dna/dna=has_dna(src)
if(!dna)return
if(new_mutantrace)
//dna.mutantrace=new_mutantrace
if(species_list.Find(new_mutantrace))
//var/typ=species_list[species_list.Find(dna.species.id)]
//dna.species=new typ()
dna.species=kpcode_race_get(new_mutantrace)
dna.uni_identity = setblock(dna.uni_identity, DNA_MUTANTRACE_BLOCK, dna.generate_race_block())
regenerate_icons()
/datum/dna/proc/generate_cock_block()
var/cock_block=0
if(cock["has"])
cock_block+=1
if(vagina)
cock_block+=2
return construct_block(cock_block+1, 4)
/mob/living/proc/set_cock_block()
var/datum/dna/dna=has_dna(src)
if(!dna)return
dna.uni_identity = setblock(dna.uni_identity, DNA_COCK_BLOCK, dna.generate_cock_block())
/mob/living/proc/is_taur()
if(istype(src,/mob/living/carbon/human)&&src:dna&&src:dna:taur)
if(src:dna:species&&kpcode_cantaur(src:dna:species))
return 1
return 0

View File

@@ -1,220 +0,0 @@
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/living
var/sizeplay_size=SIZEPLAY_NORMAL
proc
sizeplay_set(var/newsize)
if(!istype(src,/mob/living/carbon))
if(newsize<initial(src.sizeplay_size) || newsize>initial(src.sizeplay_size)+1)
return
if(newsize==initial(src.sizeplay_size))
//src.transform=get_matrix_norm()
//src.pixel_y=0
stable_matrix(get_matrix_norm(),0)
src.sizeplay_size=newsize
return
else if(newsize>initial(src.sizeplay_size))
//src.transform=get_matrix_large()
//src.pixel_y=16
stable_matrix(get_matrix_large(),8)
src.sizeplay_size=newsize
return
return //Paranoid returns
else if(newsize==SIZEPLAY_TINY)
//src.transform=get_matrix_smallest()
//src.pixel_y=-8
stable_matrix(get_matrix_smallest(),-8)
src.sizeplay_size=newsize
else if(newsize==SIZEPLAY_MICRO)
//src.transform=get_matrix_small()
//src.pixel_y=-8
stable_matrix(get_matrix_small(),-4)
src.sizeplay_size=newsize
else if(newsize==SIZEPLAY_MACRO)
//src.transform=get_matrix_large()
//src.pixel_y=16
stable_matrix(get_matrix_large(),8)
src.sizeplay_size=newsize
else if(newsize==SIZEPLAY_HUGE) // Huge should be the largest size
// removed these comments
// not being used anyway
stable_matrix(get_matrix_largest(),16)
src.sizeplay_size=newsize
else
//src.transform=get_matrix_norm()
//src.pixel_y=0
stable_matrix(get_matrix_norm(),0)
src.sizeplay_size=SIZEPLAY_NORMAL
// src.updateappearance
sizeplay_shrink()
//if(!istype(src,/mob/living/carbon))
// return
if(sizeplay_size>SIZEPLAY_TINY)
src.sizeplay_set(sizeplay_size-1)
for(var/mob/living/M in src.stomach_contents)
M.sizeplay_shrink()
sizeplay_grow()
//if(!istype(src,/mob/living/carbon))
// return
if(sizeplay_size<SIZEPLAY_HUGE)
src.sizeplay_set(sizeplay_size+1)
for(var/mob/living/M in src.stomach_contents)
M.sizeplay_grow()
stable_matrix(var/matrix/sze,var/pixel_en)
sze.TurnTo(0,lying)
animate(src, transform = sze, time = 4, pixel_y = pixel_en, easing = EASE_IN|EASE_OUT)
/mob/living/simple_animal/lizard/sizeplay_size=SIZEPLAY_MICRO
/mob/living/simple_animal/mouse/sizeplay_size=SIZEPLAY_MICRO
//var/matrix/transform_small=new().Scale(0.5)
//var/matrix/transform_norm=new()
//var/matrix/transform_large=new().Scale(2)
/proc/get_matrix_largest()
var/matrix/mtrx=new()
return mtrx.Scale(2)
/proc/get_matrix_large()
var/matrix/mtrx=new()
return mtrx.Scale(1.5)
/proc/get_matrix_norm()
var/matrix/mtrx=new()
return mtrx
/proc/get_matrix_small()
var/matrix/mtrx=new()
return mtrx.Scale(0.7)
/proc/get_matrix_smallest()
var/matrix/mtrx=new()
return mtrx.Scale(0.5)
/obj/item/projectile/sizeray
name = "mystery 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/ammo_casing/energy/laser/growthray
projectile_type = /obj/item/projectile/sizeray/growthray
select_name = "redray"
/obj/item/ammo_casing/energy/laser/shrinkray
projectile_type = /obj/item/projectile/sizeray/shrinkray
select_name = "blueray"
/obj/item/projectile/sizeray/shrinkray/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living))
var/mob/living/M=target
M.sizeplay_shrink()
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
M.sizeplay_grow()
return 1
//Gun here
/obj/item/weapon/gun/energy/laser/sizeray
name = "mystery raygun"
icon_state = "bluetag"
desc = "This will be fun!"
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
charge_tick = 0
//special_check(var/mob/living/carbon/human/M)
//return 1
New()
..()
SSobj.processing |= src
Destroy()
SSobj.processing.Remove(src)
..()
process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
update_icon()
return 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 ..()
/obj/item/weapon/gun/energy/laser/sizeray/one
name="shrink ray"
/obj/item/weapon/gun/energy/laser/sizeray/two
name="growth ray"
icon_state = "redtag"
ammo_type = list(/obj/item/ammo_casing/energy/laser/growthray)
///////////////////////
//PIXEL_Y UPDATE PROC//
///////////////////////
/*
/mob/update_pixel_y(mob/living/user)
..()
var/final_pixel_y = null
var/matrix/mtrx=new()
if(mtrx.Scale(0.5))
pixel_y = -8
final_pixel_y = -8
return
if(mtrx.Scale(0.7))
pixel_y = -4
final_pixel_y = -4
return
if(mtrx.Scale(1))
pixel_y = 0
final_pixel_y = 0
return
if(mtrx.Scale(1.5))
pixel_y = 8
final_pixel_y = 8
return
if(mtrx.Scale(2))
pixel_y = 16
final_pixel_y = 16
return
else
pixel_y = 0 //just in case you somehow ended up with some other size we'll put you back to normal
return
*/

View File

@@ -1,143 +0,0 @@
//Ehh, I'll copy some of the worm code. It will need a lot of changes to work right, though.
/mob/living/simple_animal/naga_segment
pixel_x=-16
pixel_y=-16
icon='icons/mob/special/naga.dmi'
icon_state="tail"
name="naga tail"
density = 0
anchored=1
layer=3
stop_automated_movement = 1
animate_movement = NO_STEPS
var/mob/living/simple_animal/naga_segment/previous
var/mob/living/simple_animal/naga_segment/next
var/ticks_away = 0
var/global/next_naga_id=1
var/id=0
var/internal_id=0
var/mob/living/human=null
speed = -1
main
animate_movement = NO_STEPS
New(var/location, var/segments = 6)
..()
id=next_naga_id
next_naga_id++
var/mob/living/simple_animal/naga_segment/current = src
for(var/i = 1 to segments)
var/mob/living/simple_animal/naga_segment/newSegment = new /mob/living/simple_animal/naga_segment/(loc)
current.Attach(newSegment)
current = newSegment
current.id=id
current.internal_id=i
Life()
..()
if(human&&loc!=human.loc)
Move(human.loc)
if(loc!=human.loc)
loc=human.loc
crumple(1)
if(next && !(next in view(src,1)))
ticks_away++
if(ticks_away>2)
crumple()
else
ticks_away=0
if(stat == DEAD)
if(next)
next.previous=null
next=null
//move bulges and digest procs here
update_icon()
return
//Delete()
// if(previous)
// previous.Detach()
// ..()
Move()
var/attachementNextPosition = loc
if(..())
if(previous)
previous.Move(attachementNextPosition)
update_icon()
proc/crumple(var/humhead=0)
if(!humhead)
loc=next.loc
if(previous)
previous.crumple()
proc/update_icon()
//if(stat == CONSCIOUS || stat == UNCONSCIOUS)
if(!istype(loc,/turf/))return
if(!next&&!previous)
icon_state="tailSEVERED"
return
var/next_d=0
if(next&&next.loc!=src.loc)
next_d=get_dir(src,next)
if(previous)
var/prev_d=0
if(previous.loc!=src.loc)
prev_d=get_dir(src,previous)
if(next_d==prev_d)
icon_state="tail0-[prev_d]"
else if(prev_d<next_d)
icon_state="tail[prev_d]-[next_d]"
else
icon_state="tail[next_d]-[prev_d]"
else
icon_state="tail[next_d]" //if 0, blank icon
//and now, move to top of previous parts
var/lowest_id=-1
for(var/mob/living/simple_animal/naga_segment/ns in loc)
if(ns==src)continue
if(ns.id!=src.id)continue
if(lowest_id==-1||ns.internal_id<lowest_id)
lowest_id=ns.internal_id
if(internal_id<lowest_id)
var/turf/T = src.loc
src.loc = null
src.loc = T
return
proc/Attach(var/mob/living/simple_animal/naga_segment/attachement)
if(!attachement)
return
previous = attachement
attachement.next = src
return
proc/Detach(die = 0)
//var/mob/living/simple_animal/naga_segment/newHead = new /mob/living/simple_animal/naga_segment/main(loc,0)
//var/mob/living/simple_animal/naga_segment/newHeadPrevious = previous
if(next)
next.previous=null
next=null
//newHead.Attach(newHeadPrevious)
//if(die)
// newHead.Die()
//del(src)

View File

@@ -1,642 +0,0 @@
obj/vore_preferences
// 0 = current vore mode, 1 = inside view, 2 = vore abilities, 3 = banned vores
var/current_tab = 0
var/tab_mod = 0
var/mob/living/target
var/loop //might as well make this a global list later instead
/obj/vore_preferences/New(client/C)
//Get preferences
loop=src
if(!target) return
for(var/obj/vore_preferences/VP in world)
if(VP!=src&&VP.target==target)
if(target.ckey=="jayehh" && "poojawa" && "nebulacallisto" && "leonleonardo" && "brimcon" && "cyrema" && "mrsebbi" && "subtumaka")
target << "<B>DEBUG:</B> Deleted an old vore panel with a tab of [VP.current_tab]."
//VP.loop=0
return
/obj/vore_preferences
proc/GetOrgan(var/organ)
switch(organ)
if("cock")
return target.vore_cock_datum
if("balls")
return target.vore_balls_datum
if("womb")
return target.vore_womb_datum
if("breast")
return target.vore_breast_datum
if("tail")
return target.vore_tail_datum
if("insole")
return target.vore_insole_datum
if("insuit")
return target.vore_insuit_datum
else
return target.vore_stomach_datum
proc/GenerateMethodSwitcher(var/method,var/alt_name)
var/dat=""
dat += "<a href='?src=\ref[src];preference=current;method=[method]' [target.vore_current_method == method ? "class='linkOn'" : ""]>[alt_name]</a> "
return dat
proc/GenerateAbilitySwitcher(var/method,var/alt_name)
var/dat=""
dat += "<B>[alt_name]:</B> "
if(method!=VORE_METHOD_ORAL)
dat += AbilityHelper(method,VORE_SIZEDIFF_DISABLED,"Disable")
dat += AbilityHelper(method,VORE_SIZEDIFF_TINY,"Tiny")
dat += AbilityHelper(method,VORE_SIZEDIFF_SMALLER,"Smaller")
dat += AbilityHelper(method,VORE_SIZEDIFF_SAMESIZE,"Same-Size")
dat += AbilityHelper(method,VORE_SIZEDIFF_DOUBLE,"Bigger")
if(target.vore_ability[num2text(VORE_METHOD_ORAL)]==VORE_SIZEDIFF_ANY)
dat += AbilityHelper(method,VORE_SIZEDIFF_ANY,"Any")
dat += "<BR>"
return dat
proc/AbilityHelper(var/method,var/size,var/alt_name)
var/dat=""
if(method==VORE_METHOD_ORAL||size<=target.vore_ability[num2text(VORE_METHOD_ORAL)])
dat += "<a href='?src=\ref[src];preference=ability;method=[method];size=[size]' [target.vore_ability[num2text(method)]==size ? "class='linkOn'" : ""]>[alt_name]</a> "
return dat
proc/GenerateBanSwitcher(var/method,var/alt_name)
var/dat=""
dat += "[target.vore_banned_methods&method ? "<B>" : ""]<a href='?src=\ref[src];preference=ban;method=[method]'>[alt_name]</a>[target.vore_banned_methods&method ? "</B>" : ""] "
return dat
proc/GenerateExBanSwitcher(var/method,var/alt_name)
var/dat=""
dat += "[target.vore_extra_bans&method ? "<B>" : ""]<a href='?src=\ref[src];preference=exban;method=[method]'>[alt_name]</a>[target.vore_extra_bans&method ? "</B>" : ""] "
return dat
proc/GenerateDigestionSwitcher(var/organ)
var/dat=""
var/datum/vore_organ/VD=GetOrgan(organ)
var/datum/vore_organ/temp_chk=GetOrgan("stomach")
dat += "<B>Digestion: </B>"
if(temp_chk.factor_offset<0)dat += "<a href='?src=\ref[src];preference=digest_h;organ=[organ]' [VD.healing_factor > 0 ? "class='linkOn'" : ""]>Heal</a> "
if(temp_chk.factor_offset<1)dat += "<a href='?src=\ref[src];preference=digest;speed=[VORE_DIGESTION_SPEED_NONE];organ=[organ]' [(VD.digestion_factor+VD.healing_factor) == VORE_DIGESTION_SPEED_NONE ? "class='linkOn'" : ""]>None</a> "
dat += "<a href='?src=\ref[src];preference=digest;speed=[VORE_DIGESTION_SPEED_SLOW];organ=[organ]' [VD.digestion_factor == VORE_DIGESTION_SPEED_SLOW ? "class='linkOn'" : ""]>Slow</a> "
if(temp_chk.factor_offset>-1)dat += "<a href='?src=\ref[src];preference=digest;speed=[VORE_DIGESTION_SPEED_FAST];organ=[organ]' [VD.digestion_factor == VORE_DIGESTION_SPEED_FAST ? "class='linkOn'" : ""]>Normal</a> "
if(temp_chk.factor_offset>0)dat += "<a href='?src=\ref[src];preference=digest;speed=[VORE_DIGESTION_SPEED_ABNORMAL];organ=[organ]' [VD.digestion_factor == VORE_DIGESTION_SPEED_ABNORMAL ? "class='linkOn'" : ""]>Fast</a> "
dat += "<BR>"
return dat
proc/GenerateRelease(var/organ)
var/dat=""
var/datum/vore_organ/VD=GetOrgan(organ)
dat += "You will <a href='?src=\ref[src];preference=trap;organ=[organ];keep=[VD.escape ? "0" : "1"]'>[VD.escape ? "" : "not "]let</a> people escape. "
dat += "<a href='?src=\ref[src];preference=release;organ=[organ]'>Release</a>"
if(organ=="stomach")
dat += "<a href='?src=\ref[src];preference=release;organ=[organ];extra_info=[VORE_EXTRA_FULLTOUR]'>Fulltour</a>"
if(organ=="cock"||organ=="breast"||organ=="womb")
dat += "<a href='?src=\ref[src];preference=tab;tab=7;mod=[organ]'>Into</a>"
dat+="<BR>"
return dat
proc/ShowChoices(mob/user)
loop=src
if(!user || !user.client) return
if(!target) return //the =="kingpygmy" was alerting me to this.
var/dat = "<center>"
if(istype(target,/datum/preferences))
if(current_tab<2||current_tab>3)
if(current_tab!=8)
current_tab=2
dat += "<a href='?src=\ref[src];preference=tab;tab=2' [current_tab == 2 ? "class='linkOn'" : ""]>\[Ability\]</a> "
dat += "<a href='?src=\ref[src];preference=tab;tab=3' [current_tab == 3 ? "class='linkOn'" : ""]>\[Bans\]</a> "
dat += "<a href='?src=\ref[src];preference=tab;tab=8' [current_tab == 8 ? "class='linkOn'" : ""]>\[Other\]</a>"
else
dat += "<a href='?src=\ref[src];preference=tab;tab=0' [current_tab == 0 ? "class='linkOn'" : ""]>\[Manage\]</a> "
//if(target.get_last_organ_in())
dat += "<a href='?src=\ref[src];preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>\[Inside\]</a> "
dat += "<a href='?src=\ref[src];preference=tab;tab=2' [current_tab == 2 ? "class='linkOn'" : ""]>\[Ability\]</a> "
dat += "<a href='?src=\ref[src];preference=tab;tab=3' [current_tab == 3 ? "class='linkOn'" : ""]>\[Bans\]</a> "
dat += "<a href='?src=\ref[src];preference=tab;tab=8' [current_tab == 8 ? "class='linkOn'" : ""]>\[Other\]</a>"
if(target.ckey=="jayehh")
dat += " <a href='?src=\ref[src];preference=tab;tab=4' [current_tab == 4 ? "class='linkOn'" : ""]>\[Debug\]</a>"
dat += "</center>"
switch(current_tab)
if (0) //Manage Organs
dat += "<BR>"
dat += " <h2>Current Vore Method</h2>"
dat += GenerateMethodSwitcher(VORE_METHOD_ORAL,"Oral")
dat += GenerateMethodSwitcher(VORE_METHOD_ANAL,"Anal")
dat += GenerateMethodSwitcher(VORE_METHOD_COCK,"Cock")
dat += GenerateMethodSwitcher(VORE_METHOD_UNBIRTH,"Unbirth")
dat += GenerateMethodSwitcher(VORE_METHOD_BREAST,"Breast")
dat += GenerateMethodSwitcher(VORE_METHOD_TAIL,"Tail")
dat += "<BR>"
dat += GenerateMethodSwitcher(VORE_METHOD_INSOLE,"Insole")
dat += GenerateMethodSwitcher(VORE_METHOD_INSUIT,"In Suit")
dat += "(These two aren't vore)"
dat += "<BR>"
dat += "On clicking self, <a href='?src=\ref[src];preference=click;mode=[target.vore_mode==VORE_MODE_EAT ? VORE_MODE_FEED : VORE_MODE_EAT]'>[target.vore_mode==VORE_MODE_EAT ? "eat" : "feed"]</a> the grabbed person"
dat += "<a href='?src=\ref[src];preference=headfirst;mode=[!target.vore_head_first]'>[target.vore_head_first ? "head-first" : "feet-first"]</a>."
if(!target.vore_head_first)
dat+="<br>(Foot-first not currently not finsihed. Only works when you are the one eating prey.)"
dat += "<BR><BR>"
dat += "<B>Remains:</B>"
dat += " <a href='?src=\ref[src];preference=set_remains;mode=[VORE_REMAINS_NONE]'[target.vore_remains_mode == VORE_REMAINS_NONE ? "class='linkOn'" : ""]>None</a>"
dat += " <a href='?src=\ref[src];preference=set_remains;mode=[VORE_REMAINS_GENERIC]'[target.vore_remains_mode == VORE_REMAINS_GENERIC ? "class='linkOn'" : ""]>Generic</a>"
dat += " <a href='?src=\ref[src];preference=set_remains;mode=[VORE_REMAINS_NAMED]'[target.vore_remains_mode == VORE_REMAINS_NAMED ? "class='linkOn'" : ""]>Named</a>"
dat += " <h2>Stomach</h2>"
dat += GenerateDigestionSwitcher("stomach")
dat += GenerateRelease("stomach")
if(target.has_vagina())
dat += " <h2>Womb</h2>"
dat += GenerateDigestionSwitcher("womb")
dat += "<B>Transformation: </B><a href='?src=\ref[src];preference=tab;tab=6;mod=womb'>Set</a>[target.vore_womb_datum.tf_factor ? "(On)" : ""]<BR>"
dat += GenerateRelease("womb")
if(target.has_cock())
dat += " <h2>Cock</h2>"
dat += GenerateDigestionSwitcher("cock")
dat += "<B>Balls </B>"
dat += GenerateDigestionSwitcher("balls")
dat += "<B>Cock Transformation: </B><a href='?src=\ref[src];preference=tab;tab=6;mod=cock'>Set</a>[target.vore_cock_datum.tf_factor ? "(On)" : ""]<BR>"
dat += "<B>Balls Transformation: </B><a href='?src=\ref[src];preference=tab;tab=6;mod=balls'>Set</a>[target.vore_balls_datum.tf_factor ? "(On)" : ""]<BR>"
dat += "<B>Move to balls: </B>"
dat += "<a href='?src=\ref[src];preference=transfer;speed=[VORE_TRANSFER_SPEED_NONE];organ=cock;dest=balls' [target.vore_cock_datum.transfer_factor == VORE_TRANSFER_SPEED_NONE ? "class='linkOn'" : ""]>No</a> "
dat += "<a href='?src=\ref[src];preference=transfer;speed=[VORE_TRANSFER_SPEED_FAST];organ=cock;dest=balls' [target.vore_cock_datum.transfer_factor == VORE_TRANSFER_SPEED_FAST ? "class='linkOn'" : ""]>Yes</a> "
dat += "<BR>"
dat += GenerateRelease("cock")
if(target.has_boobs())
dat += " <h2>Breast</h2>"
dat += GenerateDigestionSwitcher("breast")
dat += GenerateRelease("breast")
if(target.kpcode_mob_has_tail())
dat += " <h2>Tail</h2>"
dat += GenerateDigestionSwitcher("tail")
dat += "<B>Move to stomach: </B>"
dat += "<a href='?src=\ref[src];preference=transfer;speed=[VORE_TRANSFER_SPEED_NONE];organ=tail;dest=stomach' [target.vore_tail_datum.transfer_factor == VORE_TRANSFER_SPEED_NONE ? "class='linkOn'" : ""]>No</a> "
dat += "<a href='?src=\ref[src];preference=transfer;speed=[VORE_TRANSFER_SPEED_SLOW];organ=tail;dest=stomach' [target.vore_tail_datum.transfer_factor == VORE_TRANSFER_SPEED_SLOW ? "class='linkOn'" : ""]>Yes</a> "
dat += "<BR>"
dat += GenerateRelease("tail")
else if(target.vore_tail_datum.contents.len)
target.vore_tail_datum.release()
dat += " <h2>Inside your Suit</h2>"
dat += "<a href='?src=\ref[src];preference=release;organ=insuit'>Unzip your suit</a>"
if (1) //Inside View
dat += "<BR>"
var/datum/vore_organ/container=target.get_last_organ_in()
if(!container)
dat += "You are not currently inside someone."
else if(istype(container,/datum/vore_organ/stomach))
dat += "You are in [container.owner]'s stomach. It is soft, wet, and moving.The walls gently squeeze around you from all sides as their heartbeat and breathing echo in your ears. The gurgles of their digestive system rumble all around you."
if(container.digestion_factor==VORE_DIGESTION_SPEED_SLOW)
dat += "You feel a slight, burning tingle on your skin.The walls work at kneading over your form to soften you up. You're being digested! "
else if(container.digestion_factor)
dat += "Your body is quickly digesting and the air is getting more and more thin after that belch! You won't last long! "
if(container.has_people()>1)
dat += "You can feel [container.has_people()-1] other [container.has_people()>2 ? "people" : "person"] in the stomach. "
else if(istype(container,/datum/vore_organ/cock)||istype(container,/datum/vore_organ/balls))
dat += "You are in [container.owner]'s [istype(container,/datum/vore_organ/cock) ? "cock" : "balls"]. "
if(container.digestion_factor==VORE_DIGESTION_SPEED_SLOW)
dat += "You feel a slight, burning tingle on your skin. You're being melted! "
else if(container.digestion_factor)
dat += "Your body is quickly turning into [container.owner] [pick("spooge","cum","semen","batter","seed")] and the air is scarce. You won't last long! "
if(container.has_people()>1)
dat += "You can feel [container.has_people()-1] other [container.has_people()>2 ? "people" : "person"] in your cum-drenched and musky prison. Their forms press up close to your own. "
if(container.digestion_count)
dat += "It seems the cum was once a person or thing... or maybe even multiple? "
else if(istype(container,/datum/vore_organ/womb))
dat += "You are in [container.owner]'s womb. The smooth walls press over you, suspending you in a feeling of almost zero gravity. Their heartbeat and breathing is quieter here, and the gurgles of their digestive system join the internal song."
if(container.digestion_factor==VORE_DIGESTION_SPEED_SLOW||container.tf_factor)
dat += "You feel a slight, odd tingle on your skin. The warmth should make you doze off soon enough. "
else if(container.digestion_factor)
dat += "Your body is quickly digesting within [container.owner]'s womb, the air is thin and you're already having trouble staying awake "
if(container.has_people()>1)
dat += "You can feel [container.has_people()-1] other [container.has_people()>2 ? "people" : "person"] in your fleshy prison. "
else if(istype(container,/datum/vore_organ/breast))
dat += "You are in [container.owner]'s breast. "
if(container.digestion_factor)
dat += "Your body is getting rather milky, you're being melted inside these breasts! "
if(container.has_people()>1)
dat += "You can feel [container.has_people()-1] other [container.has_people()>2 ? "people" : "person"] in your jiggly prison. "
else if(istype(container,/datum/vore_organ/tail))
dat += "You are in [container.owner]'s tail. Each shift of their hips causes your world to move about ever so much. "
if(container.digestion_factor==VORE_DIGESTION_SPEED_SLOW)
dat += "You feel a slight, burning tingle on your skin. The swaying is luring you to just close your eyes and give in. "
else if(container.digestion_factor)
dat += "Your body is quickly digesting as a lump inside [container.owner]'s tail. The air is thin and you won't last much longer! "
if(container.has_people()>1)
dat += "You can feel [container.has_people()-1] other [container.has_people()>2 ? "people" : "person"] in your fleshy prison. "
if(container.transfer_factor)
dat += "The tail's muscles are sliding you somewhere deeper inside of your predator, you can already feel parts of you being squeezed into the wrinkled folds of that stomach."
else if(istype(container,/datum/vore_organ/insole))
dat += "You are pressed against [container.owner]'s foot. Each step they take presses over your form. "
else if(istype(container,/datum/vore_organ/insuit))
dat += "You are pressed against [container.owner]'s form. It is very stuffy, and their scent is all around you. "
else
dat += "You're not sure where you are. "
dat += "<BR>"
dat += "<BR>"
var/datum/vore_organ/orgch
orgch=GetOrgan("stomach")
if(orgch.has_people())
dat += "Your [orgch.digestion_factor ? "gurgly " : ""]stomach [pick("bulges","swells","is distended")] with [orgch.has_people()] [orgch.has_people()>1 ? "people" : "person"]. "
dat += "<BR>"
orgch=GetOrgan("womb")
if(orgch.has_people())
dat += "You have [orgch.digestion_factor ? "kneading " : ""] womb [pick("bulges","swells","is distended")] with [orgch.has_people()] [orgch.has_people()>1 ? "people" : "person"] withing your lower belly. Their weight is liable to be a pleasent addition to your hips. "
dat += "<BR>"
orgch=GetOrgan("cock")
if(orgch.has_people()||orgch.digestion_count)
dat += "Your cock swells with [orgch.has_people()+orgch.digestion_count] [orgch.has_people()+orgch.digestion_count>1 ? "people" : "person"]. "
if(orgch.digestion_count)
dat += "Not that they're not [pick("spooge","batter","seed")] by now. "
dat += "<BR>"
orgch=GetOrgan("balls")
if(orgch.has_people()||orgch.digestion_count)
dat += "Your balls swell with [orgch.has_people()+orgch.digestion_count] [orgch.has_people()+orgch.digestion_count>1 ? "people" : "person"]. "
if(orgch.digestion_count)
dat += "Not that they're not [pick("spooge","batter","seed")] by now. "
dat += "<BR>"
orgch=GetOrgan("breast")
if(orgch.has_people()||orgch.digestion_count)
dat += "Your breasts swell with [orgch.has_people()+orgch.digestion_count] [orgch.has_people()+orgch.digestion_count>1 ? "people" : "person"]. "
if(orgch.digestion_count)
dat += "They may just be milk, though. "
dat += "<BR>"
orgch=GetOrgan("tail")
if(orgch.has_people())
dat += "Your tail has a wriggly lump[orgch.has_people()>1 ? "s" : ""] within it[orgch.transfer_factor ? " that slowly moves toward the base of it, your stomach will swell out soon" : ""]. "
dat += "<BR>"
orgch=GetOrgan("insole")
if(orgch.has_people())
dat += "Your insole[orgch.has_people()>1 ? "s" : ""] fit[orgch.has_people()>1 ? "" : "s"] snugly against your [orgch.has_people()>1 ? "feet" : "foot"]. Each step you make is pressing against them. "
dat += "<BR>"
orgch=GetOrgan("insuit")
if(orgch.has_people())
dat += "[orgch.has_people()>1 ? "Smaller people" : "A smaller person"] squirm[orgch.has_people()>1 ? "" : "s"] in your clothes, against your form."
dat += "<BR>"
if (2) //Vore Abilities
target.vore_ability=sanitize_vore_list(target.vore_ability)
dat += "<BR>"
dat += " <B>Select what size difference you can vore at.</B> As a failsafe, alternative vore can not be raised past oral. To change alternative vores to go higher, please adjust oral.<BR>"
dat += GenerateAbilitySwitcher(VORE_METHOD_ORAL,"Oral")
dat += GenerateAbilitySwitcher(VORE_METHOD_ANAL,"Anal")
dat += GenerateAbilitySwitcher(VORE_METHOD_COCK,"Cock")
dat += GenerateAbilitySwitcher(VORE_METHOD_UNBIRTH,"Unbirth")
dat += GenerateAbilitySwitcher(VORE_METHOD_BREAST,"Breast")
if(istype(target,/datum/preferences)||target.kpcode_mob_has_tail())
dat += GenerateAbilitySwitcher(VORE_METHOD_TAIL,"Tail")
if(istype(target,/datum/preferences))
var/datum/preferences/PD=target
dat += "<BR>"
dat += "<h2>Sex Organs</h2>"
dat += "<B>Cock: </B>"
var/youhavea="no"
switch(PD.p_cock["has"])
if(1)
youhavea="one"
if(2)
youhavea="a huge"
if(3)
youhavea="two"
dat += "You have <a href='?src=\ref[src];preference=cock;change=has'>[youhavea]</a> cock[youhavea=="two" ? "s" : ""]."
dat += "<BR>Type: <a href='?src=\ref[src];preference=cock;change=type'>[PD.p_cock["type"]]</a>"
dat += "<BR>Colour: <span style='border:1px solid #161616; background-color: #[PD.p_cock["color"]];'>&nbsp;&nbsp;&nbsp;</span> "
dat += "<a href='?src=\ref[src];preference=cock;change=color'>(Change)</a><BR>"
dat += "<B>Vagina: </B>"
dat += "<a href='?src=\ref[src];preference=vagina;change=has'>You [PD.p_vagina ? "have" : "don't have"] one.</a><BR>"
//dat += "<BR>Show extra info when examining others? "
//dat += "<a href='?src=\ref[src];preference=showgen'>[PD.show_gen ? "Yes" : "No"]</a><BR>"
if (3) //Vore Bans
dat += "<BR>"
dat += " <B>Click a method to ban it.</B> Banned methods will appear in bold. When banned, you cannot be eaten with this vore type.<BR>"
//dat += GenerateBanSwitcher(VORE_METHOD_ORAL,"Oral") Doesn't work yet
dat += GenerateBanSwitcher(VORE_METHOD_COCK,"Cock")
dat += GenerateBanSwitcher(VORE_METHOD_ANAL,"Anal")
dat += GenerateBanSwitcher(VORE_METHOD_UNBIRTH,"Unbirth")
dat += GenerateBanSwitcher(VORE_METHOD_BREAST,"Breast")
dat += GenerateBanSwitcher(VORE_METHOD_TAIL,"Tail")
dat += "<BR>"
dat += GenerateBanSwitcher(VORE_METHOD_INSOLE,"Insole")
dat += GenerateBanSwitcher(VORE_METHOD_INSUIT,"In Suit")
dat += "<BR>"
dat += " <B>These ones involve release.</B> If you are digested while one of these bans are enabled, the predator will have to use a non-banned release to use the banned method again.<BR>"
dat += GenerateExBanSwitcher(VORE_EXTRA_FULLTOUR,"Fulltour")
dat += GenerateExBanSwitcher(VORE_EXTRA_REMAINS,"Remains")
if (4) //Debug?!
// dat += "<BR>"
// if(target.ckey=="jayehh"|| "poojawa"|| "nebulacallisto"|| "leonleonardo"|| "brimcon"|| "cyrema"|| "mrsebbi"|| "subtumaka")
// dat += "<h2>Debug Options</h2>"
// dat += "<B>Vore Log:</B> <a href='?src=\ref[src];preference=tab;tab=5;mod=vore'>Check</a>"
// dat += "<BR><B>Observe Log:</B> <a href='?src=\ref[src];preference=tab;tab=5;mod=observe'>Check</a>"
// dat += "<BR><B>Whitelist:</B> <a href='?src=\ref[src];preference=tab;tab=5;mod=whitelist'>Check</a>"
// //dat += "<BR><B>World Log:</B> <a href='?src=\ref[src];preference=tab;tab=5;mod=world'>Check</a>"
// dat += "<BR><B>Size: </B>"
// dat += "<a href='?src=\ref[src];preference=grow'>Grow</a>"
// dat += "<a href='?src=\ref[src];preference=shrink'>Shrink</a>"
// dat += "<BR><B>Taur: </B>"
// dat += "<a href='?src=\ref[src];preference=taur'>Toggle</a>"
// //dat += "<BR><B>Naga: </B>"
// //dat += "<a href='?src=\ref[src];preference=naga'>On</a>"
// dat += "<BR><B>Spawn: </B>"
// //dat += "<a href='?src=\ref[src];preference=spawn;item=narky'>Narky Gear</a>"
// dat += "<a href='?src=\ref[src];preference=spawn;item=shrink'>Shrink Ray</a>"
// dat += "<a href='?src=\ref[src];preference=spawn;item=grow'>Growth Ray</a>"
// if (5) //Log menu. Logically, if Poojawa bastardizes enough code, it'll work, right?
// dat += "<BR>"
// if(target.ckey=="jayehh"|| "poojawa"|| "nebulacallisto"|| "leonleonardo"|| "brimcon"|| "cyrema"|| "mrsebbi"|| "subtumaka")
// switch(tab_mod)
// if("observe")
// dat += "<h2>Observe Log</h2>"
// dat += global_observe_log
//if("world")
// dat += "<h2>World Log</h2>"
// if("whitelist")
// dat += "<h2>Whitelist</h2>"
// for(var/txt in whitelist_keys)
// dat+="[txt]<BR>"
// else
// dat += "<h2>Vore Log</h2>"
// dat += global_vore_log
if (6) //Transformation menu.
dat += "<BR>"
dat += "<h2>Transformation Menu</h2>"
var/datum/vore_organ/VO=GetOrgan(tab_mod)
dat += "Transformation for [tab_mod]: <a href='?src=\ref[src];preference=transform;organ=[tab_mod]'>Set</a>[VO.tf_factor ? "(On)" : ""]<BR>"
dat += "Work in progress. This button will be replaced with a full menu here."
if (7) //Transfer menu.
dat += BuildTransfer()
if (8) //Donate menu
dat += "<BR>"
dat += "<h2>Whitelist</h2>"
dat += "Due to issues with griefers, we have whitelisted a few features. This is only to prevent one-shot griefing, and the list will not be difficult to get into."
dat += "<BR><b>Status:</b> "
if(is_whitelisted(target.ckey))
dat +="<img src=large_stamp-deny.png>You are whitelisted. You will be able to respawn and play as head roles."
else
dat +="<img src=large_stamp-ok.png>You are not whitelisted. You will not be able to use head roles while the head whitelisting is toggled on. To become whitelisted, keep playing until we know you're not around just to cause trouble. You can also have someone trusted vouch for you."
dat += "<BR><h2>Donations</h2>"
dat += "In order to keep the server running, payment is required monthly. It is greatly appreciated for even the smallest amount of donations. Without them, it becomes difficult to keep the server afloat."
dat += "By donating you can prevent this issue and allow it to continue running. As well as helping out the server, your name will be added to the donator list and you will be priority in having suggestions, ideas, and <b>certain</b> cosmetics added for personal use."
dat += "<BR>"
dat += {"
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHLwYJKoZIhvcNAQcEoIIHIDCCBxwCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBa9x4yJhRp3SKeVGmhId+rO0BDUm/3BsRr5frmkV+Id96TuI8MxRbz8tbMpyGqbPbFL1AdZpkZ8/4Ji7eD91Ypc0YioEolBwwJO6Hu9A/vKzb9l1QqgqgXoFtdpg/iBqm8ebuIbOr9En2irCBD/tRfpQc69cUl1/WKCB3+R105kjELMAkGBSsOAwIaBQAwgawGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQI9P3sbLOEPVSAgYhqiCLcXvYoI9FYL73LsuE1gGp4EVvo6aMNW4ci9OYbW/Si+Qk+lIAMx7KKx8Hxsb3OaGuJ2TvLUaTv0ZDSa7O0w3sJVdynfxWcsmh+hX12LKXlL9yiTVPSeLwinLgKioZcR7QuSX7Jj6WYjo721M01g80N9G36RiPp94Wc5TGVLkFT9s2vIz5poIIDhzCCA4MwggLsoAMCAQICAQAwDQYJKoZIhvcNAQEFBQAwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMB4XDTA0MDIxMzEwMTMxNVoXDTM1MDIxMzEwMTMxNVowgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBR07d/ETMS1ycjtkpkvjXZe9k+6CieLuLsPumsJ7QC1odNz3sJiCbs2wC0nLE0uLGaEtXynIgRqIddYCHx88pb5HTXv4SZeuv0Rqq4+axW9PLAAATU8w04qqjaSXgbGLP3NmohqM6bV9kZZwZLR/klDaQGo1u9uDb9lr4Yn+rBQIDAQABo4HuMIHrMB0GA1UdDgQWBBSWn3y7xm8XvVk/UtcKG+wQ1mSUazCBuwYDVR0jBIGzMIGwgBSWn3y7xm8XvVk/UtcKG+wQ1mSUa6GBlKSBkTCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCBXzpWmoBa5e9fo6ujionW1hUhPkOBakTr3YCDjbYfvJEiv/2P+IobhOGJr85+XHhN0v4gUkEDI8r2/rNk1m0GA8HKddvTjyGw/XqXa+LSTlDYkqI8OwR8GEYj4efEtcRpRYBxV8KxAW93YDWzFGvruKnnLbDAF6VR5w/cCMn5hzGCAZowggGWAgEBMIGUMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbQIBADAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwNjExMDUxOTIzWjAjBgkqhkiG9w0BCQQxFgQUN4QWza5kaWSdP54QYXSbtBSHnUgwDQYJKoZIhvcNAQEBBQAEgYBNf+DRVc9d9YPCHmzcOj5MihZj2oUORmt9xyE9z0c0OTfMjaapfmHmQo1IBl71caVA6fdrQFHapkvutWxWsrP0KiTUaEy79o3QO9dal2wLg/xIE6gDBf+PNsMHE8/u1p2dwc2n9iyWuLrUdJ7aIUE7idU1Ls2lA8UczMdSuBL00A==-----END PKCS7-----
">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
"}
var/datum/browser/popup = new(user, "voreprefs", "<div align='center'>Vore Panel</div>", 0, 0, src)
popup.set_content(dat)
popup.open(0)
Topic(href, href_list)
if(..())
return
if(istype(target,/mob) && usr!=target)
usr<<"They are not you."
return
if(href_list["preference"] == "tab")
current_tab=text2num(href_list["tab"])
if(href_list["mod"])
tab_mod=href_list["mod"]
if(href_list["preference"] == "current")
target.vore_current_method = text2num(href_list["method"])
if(href_list["preference"] == "click")
target.vore_mode = text2num(href_list["mode"])
if(href_list["preference"] == "headfirst")
target.vore_head_first = text2num(href_list["mode"])
if(href_list["preference"] == "ability")
target.vore_ability[href_list["method"]] = text2num(href_list["size"])
if(text2num(href_list["method"])==VORE_METHOD_ORAL)
var/list/check_methods=list(VORE_METHOD_ANAL,VORE_METHOD_COCK,VORE_METHOD_UNBIRTH,VORE_METHOD_BREAST,VORE_METHOD_TAIL)
for(var/N in check_methods)
if(target.vore_ability[num2text(N)]>text2num(href_list["size"]))
target.vore_ability[num2text(N)]=text2num(href_list["size"])
if(href_list["preference"] == "ban")
var/method=text2num(href_list["method"])
if(target.vore_banned_methods&method)
target.vore_banned_methods &= ~method
else
target.vore_banned_methods |= method
if(href_list["preference"] == "exban")
var/method=text2num(href_list["method"])
if(target.vore_extra_bans&method)
target.vore_extra_bans &= ~method
else
target.vore_extra_bans |= method
if(href_list["preference"] == "digest")
var/datum/vore_organ/VD=GetOrgan(href_list["organ"])
var/set_speed=text2num(href_list["speed"])
if(target.reagents)
if(target.reagents.has_reagent("noantacid")&&set_speed<VD.digestion_factor)
target << "It's not working!"
return
if(target.reagents.has_reagent("antacid")&&set_speed>VD.digestion_factor)
target << "It's not working!"
return
VD.digestion_factor = set_speed
VD.healing_factor = 0
VD.tf_factor = 0
if(VD.has_people())
vore_admins("[VD.owner]'s [VD.type] digestion changed to [VD.digestion_factor].",VD.owner)
if(href_list["preference"] == "digest_h")
if(target.reagents)
if(target.reagents.has_reagent("antacid")||target.reagents.has_reagent("noantacid"))
target << "You can't control your ability to heal."
return
var/datum/vore_organ/VD=GetOrgan(href_list["organ"])
VD.digestion_factor = 0
VD.healing_factor = 1
VD.tf_factor = 0
if(VD.has_people())
vore_admins("[VD.owner]'s [VD.type] set to heal.",VD.owner)
if(href_list["preference"] == "release")
var/datum/vore_organ/VD=GetOrgan(href_list["organ"])
if(href_list["extra_info"])
VD.release(extra_info=text2num(href_list["extra_info"]))
else
VD.release()
if(href_list["preference"] == "set_remains")
target.vore_remains_mode=text2num(href_list["mode"])
if(href_list["preference"] == "dispense")
var/datum/vore_organ/VD=GetOrgan(href_list["organ"])
VD.dispense(text2num(href_list["amount"]),href_list["name"])
if(href_list["preference"] == "trap")
var/datum/vore_organ/VD=GetOrgan(href_list["organ"])
VD.escape=text2num(href_list["keep"])
if(href_list["organ"]=="cock")
VD=GetOrgan("balls")
VD.escape=text2num(href_list["keep"])
if(href_list["preference"] == "transfer")
var/datum/vore_organ/VD=GetOrgan(href_list["organ"])
VD.transfer_factor = text2num(href_list["speed"])
VD.transfer_target = GetOrgan(href_list["dest"])
if(href_list["preference"] == "transform")
target.set_vore_transform(GetOrgan(href_list["organ"]))
//vore_admins("[VD.owner]'s [VD.type] set to transform.",VD.owner)
if(href_list["preference"] == "cock")
var/datum/preferences/PD=target
switch(href_list["change"])
if("has")
var/change_val=input(usr, "Choose your cock:", "Character Preference") as null|anything in list("None","Normal","Hyper","Double")
switch(change_val)
if("None")
PD.p_cock["has"]=0
if("Normal")
PD.p_cock["has"]=1
if("Hyper")
PD.p_cock["has"]=2
if("Double")
PD.p_cock["has"]=3
if("type")
var/change_val=input(usr, "Choose your cock type:", "Character Preference") as null|anything in cock_list+"custom"
if(change_val=="custom")
change_val=input(usr, "Choose your cock type:", "Character Preference") as text
if(change_val)
PD.p_cock["type"]=change_val
if("color")
var/new_color = input(usr, "Choose your cock's colour:", "Character Preference") as null|color
if(new_color)
PD.p_cock["color"] = sanitize_hexcolor(new_color)
if(href_list["preference"] == "vagina")
var/datum/preferences/PD=target
PD.p_vagina=!PD.p_vagina
//if(href_list["preference"] == "showgen")
//var/datum/preferences/PD=target
//PD.show_gen=!PD.show_gen
if(href_list["preference"] == "grow")
target.sizeplay_grow()
if(href_list["preference"] == "shrink")
target.sizeplay_shrink()
if(href_list["preference"] == "taur")
if(target.has_dna())
var/mob/living/carbon/C=target
C.dna.taur=!C.dna.taur
// updateappearance
else
target<<"Not going to work."
/*if(href_list["preference"] == "naga")
if(check_dna_integrity(target))
var/seg_cnt=input("How many segments?", "Naga Time!", "6")
seg_cnt=text2num(seg_cnt)
if(!seg_cnt)
target<<"Invalid."
else
var/mob/living/carbon/C=target
C.dna.naga=new/mob/living/simple_animal/naga_segment/main(target.loc,seg_cnt)
target.pixel_y=8
else
target<<"Not going to work."*/
/*if(href_list["preference"] == "spawn")
if(href_list["item"] == "narky")
new /obj/item/clothing/suit/narkycuff(target.loc)
new /obj/item/clothing/shoes/narkyanklet(target.loc)
new /obj/item/clothing/under/maid/narky(target.loc)
if(href_list["item"] == "grow")
new /obj/item/weapon/gun/energy/laser/sizeray/two(target.loc)
if(href_list["item"] == "shrink")
new /obj/item/weapon/gun/energy/laser/sizeray/one(target.loc)*/
if(usr)
ShowChoices(usr)
//datum/mind/var/vore_admins=""
//var/global_vore_log=""
//proc/vore_admins(var/T,var/mob/living/pred=null,var/mob/living/prey=null)
// global_vore_log+="<B>-</B>"+T+"<BR>"
// if(pred&&pred.mind)
// pred.mind.vore_admins+="-"+T+"\n"
// if(prey&&prey.mind)
// prey.mind.vore_admins+="-"+T+"\n"
//var/global_observe_log=""
//proc/kp_log_observe(var/T)
// global_observe_log+="<B>-</B>"+T+"<BR>"
/proc/vore_admins(var/msg)
msg = "<span class=\"admin\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[msg]</span></span>"
admins << msg
proc/sanitize_vore_list(var/list/lst=null)
if(!lst||!lst.len)
lst=list(
"1"=2,
"2"=0,
"4"=0,
"8"=0,
"16"=0,
"32"=0,
"64"=1,
"128"=0,
"256"=2)
lst[num2text(VORE_METHOD_INSOLE)]=1
lst[num2text(VORE_METHOD_INSUIT)]=2
return lst

View File

@@ -1,795 +0,0 @@
datum
species
//specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
var/generic="something"
var/adjective="unknown"
var/restricted=0 //Set to 1 to not allow anyone to choose it, 2 to hide it from the DNA scanner, and text to restrict it to one person
var/tail=0
var/taur=0
human
generic="human"
adjective="ordinary"
taur="horse"
abductor
//name="abductor"
id="abductor"
generic="abductor"
adjective="spooky"
restricted=2
ailurus
//name="red panda"
id="ailurus"
generic="ailurus"
adjective="cuddly"
tail=1
restricted=2
alien
//name="alien"
id="alien"
say_mod="hisses"
generic="xeno"
adjective="phallic"
tail=1
restricted=2
armadillo
//name="armadillo"
id="armadillo"
say_mod = "drawls"
generic = "cingulate" // Superorder Xenarthra, Order Cingulata
adjective = "protected"
tail=1
attack_verb = "noms"
attack_sound = 'sound/weapons/bite.ogg'
attack_verb = "nom" // apparently attack verbs are just the verb, no S. shrug
attack_sound = 'sound/weapons/bite.ogg'
restricted=2
anubis
//name="anubis"
id="anubis"
say_mod = "intones"
generic="jackal" // mmm...jackal or canine? i'll leave it for now
adjective="cold"
attack_verb = "claw"
restricted=2
beaver
//name="beaver"
id="beaver"
say_mod = "chitters"
generic="rodent"
adjective="damnable"
tail=1
attack_verb = "tailslap"
attack_sound = 'sound/items/dodgeball.ogg'
restricted=2
beholder
//name="beholder"
id="beholder"
say_mod = "jibbers"
generic="body part"
adjective="all-seeing"
tail=0
attack_verb = "visually assault"
attack_sound = 'sound/magic/MM_Hit.ogg' // MAGIC MISSILE! MAGIC MISSILE!
restricted=2
boar
//name="boar"
id="boar"
generic="pig"
adjective="wild and curly"
tail=1
restricted=2
capra
//name="caprine"
id="capra"
generic="goat"
adjective="irritable"
restricted=2
carp
//name="carp"
id="carp"
say_mod = "glubs"
generic = "abomination"
adjective = "violently fishy"
tail=1
eyes = "carpeyes"
attack_verb = "nom"
attack_sound = 'sound/weapons/bite.ogg'
restricted=2
corgi
//name="corgi"
id="corgi"
say_mod ="yaps"
generic="canine"
adjective="corgalicious"
tail=1
restricted=2
corvid
//name="corvid"
id="corvid"
say_mod = "caws"
generic="bird"
adjective="mask-piercing"
tail=1
attack_verb = "whack"
restricted=2
cow
//name="cow"
id="cow"
say_mod = "moos"
generic="bovine"
adjective="wise"
tail=1
taur=1
restricted=2
coyote
//name="coyote"
id="coyote"
say_mod = "yips"
generic="canine"
adjective="mangy"
tail=1
restricted=2
crocodile
//name="crocodile"
id="croc"
generic="water reptile"
adjective="scaled"
tail=1
restricted=2
dalmatian
//name="dalmatian"
id="dalmatian"
say_mod = "ruffs"
generic="canine"
adjective="spotty"
tail=1
restricted=2
deer
//name="deer"
id="deer"
say_mod = "grunts"
generic = "cervid"
adjective = "skittish"
tail=1 // that's better
attack_verb = "gore"
attack_sound = 'sound/weapons/bladeslice.ogg'
restricted=2
drake
//name="drake"
id="drake"
say_mod = "growls"
generic = "reptile"
adjective = "frilly"
tail=1 // i'd use lizard tails but drakes have frills included on the icons
taur=1
restricted=2
drider
//name="drider"
id="drider"
generic="humanoid"
adjective="big and hairy"
taur=1
tail=1
eyes="spidereyes"
restricted=2
fennec
//name="fennec"
id="fennec"
generic="vulpine"
adjective="foxy"
tail=1
restricted=2
fox
name="fox"
id="fox"
generic="vulpine"
adjective="foxy" // open and shut with this one, huh
tail=1
taur=1
glowfen
//name="glowfen"
id="glowfen"
generic="vulpine"
adjective="glowing"
tail=1
restricted=2
gremlin
//name="gremlin"
id="gremlin"
generic="creature"
tail=1
attack_verb = "thwack"
restricted=2
gria
//name="gria"
id="gria"
generic="reptile"
adjective="scaled"
tail=1
attack_verb = "claw"
attack_sound = 'sound/weapons/bladeslice.ogg'
restricted=2
hawk
//name="hawk"
id="hawk"
say_mod = "chirps"
generic="bird"
adjective="feathery"
tail=1
attack_verb = "whack"
restricted=2
hippo
//name="hippo"
id="hippo"
generic="hippo"
adjective="buoyant"
tail=1
restricted=2
husky
name="husky"
id="husky"
say_mod = "arfs"
generic="canine"
adjective="derpy"
tail=1
taur=1
jackalope
//name="jackalope"
id="jackalope"
generic="leporid"
adjective="hoppy and horny" //hue
attack_verb = "kick"
tail=1
restricted=2
jelly
//name="jelly"
id="jelly"
generic="jelly"
adjective="jelly"
kangaroo
//name="kangaroo"
id="kangaroo"
generic="marsupial"
adjective="bouncy"
tail=1
attack_verb = "kick"
restricted=2
lab
//name="lab"
id="lab"
say_mod = "yaps"
generic="canine"
adjective="sleek"
tail=1
taur=1
restricted=2
leporid
//name="leporid"
id="leporid"
generic="leporid"
adjective="hoppy"
tail=1
attack_verb = "kick"
restricted=2
lizard
name="lizard"
id="lizard"
generic="reptile"
adjective="scaled"
taur="naga"
tail=1
murid // i have no idea what this is
//name="murid"
id="murid"
say_mod = "squeaks"
generic="rodent"
adjective="squeaky"
tail=1
restricted=2
moth
//name="moth"
id="moth"
generic="insect"
adjective="fluttery"
eyes="motheyes" // this SHOULD work after i've updated human_face.dmi -- iska
restricted=2
mushman
//name="mushroom"
id="fung"
generic="fungi"
adjective="sporey"
say_mod = "mushes"
tail=0
restricted=2
naga
//name="naga"
id="naga"
generic="humanoid"
adjective="noodly"
taur=1
tail=1
restricted=2
otter
//name="otter"
id="otter"
say_mod = "squeaks"
generic="mustelid"
adjective="slim"
tail=1
restricted=2
otusian
//name="otusian"
id="otie"
say_mod ="growls"
generic="feline-canine"
adjective="chunky" // ??? are otusians fat????
tail=1
taur=1
restricted=2
panther
//name="panther"
id="panther"
generic="feline"
adjective="furry"
tail=1
taur=1
attack_verb = "claw"
attack_sound = 'sound/weapons/bladeslice.ogg'
restricted=2
pig
//name="pig"
id="pig"
generic="pig"
adjective="curly"
tail=1
restricted=2
plant
generic="plant"
adjective="leafy"
restricted=2
plant/pod
restricted=1
porcupine
//name="porcupine"
id="porcupine"
say_mod = "snuffles"
generic = "rodent"
adjective = "quilly"
tail=1
attack_verb = "quill-whack"
attack_sound = 'sound/weapons/slash.ogg'
restricted=2
possum
//name="possum"
id="possum"
say_mod = "chitters"
generic = "marsupial"
adjective = "rumaging"
tail=1
attack_verb = "nom"
attack_sound = 'sound/weapons/bite.ogg'
restricted=2
raccoon
//name="raccoon"
id="raccoon"
say_mod="churrs"
generic="procyonid" // Family Procyonidae
adjective="stripy"
tail=1
restricted=2
roorat
//name="kangaroo rat"
id="roorat"
generic="Heteromyidae" // ...marsupial rat? Have you tried a google search? They're a real thing.
adjective="bouncy"
tail=1
attack_verb = "kick"
restricted=2
saltman
//name="salt"
id="salt"
generic="NaCl"
adjective="salty"
restricted=2
restricted=2
seaslug
//name="sea slug"
id="seaslug"
generic="slug"
adjective="salty"
tail=1
attack_verb = "smack"
restricted=2
shark
//name="shark"
id="shark"
generic="selachimorph" // Superorder Selachimorpha
adjective="fishy"
tail=1
restricted=2
shepherd
//name="shepherd"
id="shepherd"
say_mod = "barks"
generic="canine"
adjective="happy"
tail=1
taur=1
restricted=2
skunk
//name="skunk"
id="skunk"
say_mod = "snuffles"
generic="mephit"
adjective="stinky"
tail=1
restricted=2
slime
//name="slime"
id="slime"
generic="slime"
adjective="slimy"
restricted=2
smilodon
//name="smilodon"
id="smilodon"
generic="smilodon"
adjective="toothy"
tail=1
restricted=2
snarby
//name="snarby"
id="snarby"
generic="beast"
adjective="snippy and snarly"
tail=1
attack_verb = "chomp"
attack_sound = 'sound/weapons/bite.ogg'
eyes = "snarbyeyes"
restricted=2
squirrel
//name="squirrel"
id="squirrel"
generic="rodent"
adjective="nutty"
tail=1
restricted=2
tajaran
name="tajaran"
id="tajaran"
generic="feline"
adjective="furry"
tail=1
taur=1
attack_verb = "claw"
attack_sound = 'sound/weapons/bladeslice.ogg'
toucan
name="toucan"
id="toucan"
generic="bird"
adjective="colorful"
tail=1
attack_verb = "pecks"
/* turtle
//name="turtle"
id="turtle"
generic="reptile"
adjective="hard-shelled"
tail=1
ursine
//name="bear"
id="ursine"
generic="ursine"
adjective="husky"
say_mod = "grunts"
tail=1
attack_verb = "claw"
attack_sound = 'sound/weapons/bladeslice.ogg'
wolf
//name="wolf"
id="wolf"
say_mod = "howls"
generic="canine"
adjective="shaggy"
tail=1
taur=1
zig
//name="zig"
id="zig"
generic="pok<6F>mon"
adjective="curious"
tail=1 */
/*
narky
//name="narwhal kitty"
id="narky"
say_mod="nyars"
generic="abomination"
adjective="fluffy"
restricted=2
tail=1
taur=1
attack_verb = "whack"
//husky/jordy // obsolete with the addition of overlay sprites
//name="husky"
//id="jordy"
//generic="canine"
//adjective="hyper"
//tail=1
//restricted=1
*/
fly
//name="fly"
generic="insect"
adjective="buzzy"
restricted=1
skeleton
//name="skeleton"
generic="human"
adjective="very boney"
restricted=2
attack_verb = "bone"
cosmetic_skeleton
//name="skeleton"
generic="skeleton"
adjective="boney"
restricted=2
attack_verb = "bone"
shadow
//name="shadow"
generic="darkness"
adjective="shady" // Jokes
restricted=2
golem
//name="golem"
generic="golem"
adjective="rocky"
restricted=2
golem/adamantine
//name="adamantine"
generic="golem"
adjective="rocky"
restricted=2
zombie
//name = "High Functioning Zombie"
id="zombie"
say_mod="moans"
restricted=2
plasmaman
//name="Plasmabone"
id="plasmaman"
generic="plasmaman"
adjective="toxic"
restricted=2 // don't comment these out if you don't want the world to burn
plasmaman/skin
//name="Skinbone"
id="plasmaman"
generic="plasmaman"
adjective="toxic"
restricted=2 // but if you do want the world to burn then please, by all means
pepsiman
//name="PEPSI MAAAAAN"
id="PEPSIMAAAN"
generic="beverage"
adjective="refreshing"
restricted=2 // don't want half the station to be running around with soda cans on their heads
cutebold
//name="cutebold"
id="cutebold"
say_mod = "yips"
generic = "kobo"
adjective = "cute"
tail=1
attack_verb = "nom"
attack_sound = 'sound/weapons/bite.ogg'
restricted=2
pony // of the "my little" variety
//name="pony"
id="pony"
generic="equine"
adjective="little"
tail=1
attack_verb= "kick"
restricted=2
hylotl
//name="hylotl"
id="hylotl"
say_mod = "glubs"
generic="amphibian"
adjective="fishy"
tail=0
eyes="jelleyes"
restricted=2
synth
//name = "Synth" //inherited from the real species, for health scanners and things
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
restricted=2
synth/military
//name = "Military Synth"
id = "military_synth"
restricted=2
corporate
//name = "Corporate Agent"
id = "agent"
restricted=2
/*
var/list/kpcode_race_list
proc/kpcode_race_genlist()
if(!kpcode_race_list)
var/paths = typesof(/datum/species)
kpcode_race_list = new/list()
for(var/path in paths)
var/datum/species/D = new path()
if(D.//name!="undefined")
kpcode_race_list[D.//name] = D
*/
proc/kpcode_race_getlist(var/restrict=0)
var/list/race_options = list()
for(var/r_id in species_list)
var/datum/species/R = kpcode_race_get(r_id)
if(!R.restricted||R.restricted==restrict)
race_options[r_id]=kpcode_race_get(r_id)
return race_options
proc/kpcode_race_get(var/name="human")
name=kpcode_race_san(name)
if(!name||name=="") name="human"
if(species_list[name])
var/type_to_use=species_list[name]
var/datum/species/return_this=new type_to_use()
return return_this
else
return kpcode_race_get()
proc/kpcode_race_san(var/input)
if(!input)input="human"
if(istype(input,/datum/species))
input=input:id
return input
proc/kpcode_race_restricted(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.restricted
return 2
proc/kpcode_race_tail(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.tail
return 0
proc/kpcode_race_taur(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
if(D.taur==1)
return D.id
return D.taur
return 0
proc/kpcode_race_generic(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.generic
return 0
proc/kpcode_race_adjective(var/name="human")
name=kpcode_race_san(name)
if(kpcode_race_get(name))
var/datum/species/D=kpcode_race_get(name)
return D.adjective
return 0
proc/kpcode_get_generic(var/mob/living/M)
if(istype(M,/mob/living/carbon/human))
if(M:dna)
return kpcode_race_generic(M:dna:mutantrace())
else
return kpcode_race_generic("human")
if(istype(M,/mob/living/carbon/monkey))
return "monkey"
if(istype(M,/mob/living/carbon/alien))
return "xeno"
if(istype(M,/mob/living/simple_animal))
return M.name
return "something"
proc/kpcode_get_adjective(var/mob/living/M)
if(istype(M,/mob/living/carbon/human))
if(M:dna)
return kpcode_race_adjective(M:dna:mutantrace())
else
return kpcode_race_adjective("human")
if(istype(M,/mob/living/carbon/monkey))
return "cranky"
if(istype(M,/mob/living/carbon/alien))
return "alien"
if(istype(M,/mob/living/simple_animal))
return "beastly"
return "something"
/*var/list/mutant_races = list(
"human",
"fox",
"fennec",
"lizard",
"tajaran",
"panther",
"husky",
"squirrel",
"otter",
"murid",
"leporid",
"ailurus",
"shark",
"hawk",
"jelly",
"slime",
"plant",
)*/
var/list/mutant_tails = list(
"none"=0,
"tajaran"="tajaran",
"neko"="neko",
"dog"="lab",
"wolf"="wolf",
"fox"="fox",
"mouse"="murid",
"leporid"="leporid",
"panda"="ailurus",
"pig"="pig",
"cow"="cow",
"kangaroo"="kangaroo",
"kangaroo"="kangaroo",
"pony"="pony",
"lizard"="lizard",
"cyborg"="cyborg")
var/list/mutant_wings = list(
"none"=0,
"bat"="bat",
"feathery"="feathery",
"moth"="moth",
"fairy"="fairy",
"tentacle"="tentacle"
)
var/list/cock_list = list(
"human",
"canine",
"feline",
"reptilian",
"equine")
proc/kpcode_hastail(var/S)
//switch(S)
//if("jordy","husky","squirrel","lizard","narky","tajaran","otter","murid","fox","fennec","wolf","leporid","shark","panther","ailurus","glowfen","hawk")
if(kpcode_race_tail(S)==1)
return S
if(kpcode_race_tail(S))
return kpcode_race_tail(S)
/*if("neko")
return "tajaran"
if("mouse")
return "murid"
if("panda")
return "ailurus"*/
if(S in mutant_tails)
return mutant_tails[S]
return 0
proc/kpcode_cantaur(var/S)
return kpcode_race_taur(S)

View File

@@ -1,40 +0,0 @@
datum/design/shrinkray
name = "Shrink Ray"
desc = "Make people small."
id = "shrinkray"
req_tech = list("combat" = 5, "materials" = 3, "engineering" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$diamond" = 1500)
build_path = /obj/item/weapon/gun/energy/laser/sizeray/one
category = list("Weapons")
datum/design/growthray
name = "Growth Ray"
desc = "Make people small... To the person you hit."
id = "growthray"
req_tech = list("combat" = 5, "materials" = 4, "engineering" = 3, "bluespace" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$diamond" = 1500)
build_path = /obj/item/weapon/gun/energy/laser/sizeray/two
category = list("Weapons")
datum/design/stethoscope
name = "Stethoscope"
desc = "An ordinary stethoscope."
id = "stethoscope"
req_tech = list("biotech" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 50)
build_path = /obj/item/clothing/tie/stethoscope
category = list("Medical")
/*
datum/design/stethoscope_advanced
name = "Stethoscope (Advanced)"
desc = "An advanced stethoscope that can read micro-vibrations produced by DNA, or possibly something less silly."
id = "stethoscope_advanced"
req_tech = list("biotech" = 3, "magnets" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 500)
build_path = /obj/item/clothing/tie/stethoscope/advanced
category = list("Medical")*/

View File

@@ -1,9 +0,0 @@
/mob/living/simple_animal/hostile/carp/duck
name = "space duck"
desc = "A ferocious, fang-bearing creature that resembles a rubber ducky."
icon_state = "rubduck"
icon_living = "rubduck"
icon_dead = "rubduck_dead"
icon_gib = "rubduck_gib"
meat_type = /obj/item/weapon/bikehorn
attack_sound = 'sound/items/bikehorn.ogg'

View File

@@ -1,76 +0,0 @@
//Changed var/air_master.current_cycle to SSair.times_fired
/obj/vore_preferences
proc/BuildTransfer()
var/dat= ""
dat += "<BR>"
dat += "<h2>Dispense</h2>"
var/datum/vore_organ/VO=GetOrgan(tab_mod)
dat += "<b>Currently dispensing [VO.milk_type]</b><BR>"
dat += "Generic: "
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=5;name=null'>5</a>"
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=10;name=null'>10</a>"
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=15;name=null'>15</a>"
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=20;name=null'>20</a>"
dat += "<BR>"
if(tab_mod=="cock")
VO.milk_list.Add(VO.owner.vore_balls_datum.milk_list)
VO.owner.vore_balls_datum.milk_list=new/list()
for(var/T in VO.milk_list)
dat += "[T]: "
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=5;name=[T]'>5</a>"
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=10;name=[T]'>10</a>"
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=15;name=[T]'>15</a>"
dat += "<a href='?src=\ref[src];preference=dispense;organ=[tab_mod];amount=20;name=[T]'>20</a>"
dat += " ([VO.milk_list[T]["count"]] left)<BR>"
dat += "<BR>"
dat += "Transferring people from person to person coming soon.<BR>"
return dat
/datum/vore_organ
proc/dispense(var/amount=5,var/name=null)
if(!milk_type)return
if(name=="null")name=null
var/obj/item/weapon/reagent_containers/RC=null
if(!owner.get_active_hand())
owner<<"There's nothing in your active hand."
return
if(!istype(owner.get_active_hand(), /obj/item/weapon/reagent_containers))
owner<<"You can't put [milk_type] in [owner.get_active_hand()]!"
return
RC=owner.get_active_hand()
if(!RC||!istype(RC, /obj/item/weapon/reagent_containers))return
if(!(RC.flags&OPENCONTAINER))
owner<<"You can't put [milk_type] in [owner.get_active_hand()]!"
return //No milk for you!
if(RC.reagents.total_volume >= RC.reagents.maximum_volume)
owner<<"[owner.get_active_hand()] is full!"
return //Too full!
amount=min(RC.reagents.maximum_volume-RC.reagents.total_volume,amount)
var/list/data=new/list()
if(name)
amount=min(amount,milk_list[name]["count"])
milk_list[name]["count"]=milk_list[name]["count"]-amount
data=milk_list[name]["data"]
if(milk_list[name]["count"]<=0)
milk_list.Remove(name)
if(amount>0)
if(last_release>SSair.times_fired-amount||owner.stat==2)return
last_release=SSair.times_fired
data["adjective"]=kpcode_get_adjective(owner)
data["type"]=kpcode_get_generic(owner)
//var/ownr_dna=null
if(istype(owner,/mob/living/carbon))
data["donor_DNA"]=owner:dna
//ownr_dna=owner:dna
RC.reagents.add_reagent(milk_type, amount, data)//list("digested"=name,"donor_DNA"=ownr_dna))
if(milk_type=="milk")
owner.visible_message("<span class='notice'>[owner] milks their tits into [RC].</span>")
if(milk_type=="semen")
owner.visible_message("<span class='notice'>[owner] jacks off into [RC].</span>")
if(milk_type=="femjuice")
owner.visible_message("<span class='notice'>[owner] masturbates their vagina over [RC].</span>")
playsound(owner.get_top_level_mob(), 'sound/items/drink.ogg', 50, 1)

View File

@@ -1,249 +0,0 @@
/datum/vore_transform_datum
var/tf_path
var/tf_species
var/tf_gender=NEUTER
var/tf_egg=0
proc/apply_transform(var/mob/living/targ)
return //THIS SHIT IS FUBAR -CACTUS
var/old_name=targ.real_name
var/new_gender=tf_gender==NEUTER ? targ.gender : tf_gender
var/transformation_happened=new_gender==targ.gender ? 0 : 1
var/new_path= tf_egg ? /mob/living/egg : tf_path
var/datum/dna/tmp_dna=targ.has_dna()
if(tmp_dna)
targ.last_working_dna=tmp_dna
if(tf_egg&&!tf_path)tf_path=targ.type
if(new_path&&!istype(targ,new_path))//Transform path?
targ.vore_contents_drop(targ.get_last_organ_in())
var/mob/living/new_mob = new new_path(targ.loc)
if(istype(new_mob))
new_mob.a_intent = "harm"
//new_mob.universal_speak = 1
new_mob.languages_spoken = 1
new_mob.languages_understood = 1
new_mob.vore_banned_methods=targ.vore_banned_methods
new_mob.vore_ability=targ.vore_ability
if(targ.mind)
targ.mind.transfer_to(new_mob)
else
new_mob.key = targ.key
if(targ.last_working_dna)
new_mob.last_working_dna=targ.last_working_dna
if(targ.get_last_organ_in())
targ.last_organ_in.add(new_mob)
new_mob.vore_transform_index=-200
qdel(targ)
targ=new_mob
transformation_happened=1
if(istype(targ,/mob/living/carbon)) //handle species and/or dna
var/mob/living/carbon/C=targ
C.has_dna()
if(C.last_working_dna&&C.dna)
C.dna=C.last_working_dna
if(tf_species)
C.real_name=old_name
C.vore_dna_mod(tf_species)
if(transformation_happened)
C.dna.cock=list("has"=C.gender==MALE,"type"="human","color"="900")//TEMP FIX!
C.dna.vagina=C.gender==FEMALE
transformation_happened=1
if(istype(targ,/mob/living/egg)) //handle egg
var/mob/living/egg/E=targ
src.tf_egg=0
E.hatch_tf=src
if(!E.get_last_organ_in())
E.incubate()
targ.gender=new_gender
targ.real_name=old_name
targ.name=old_name
if(transformation_happened&&targ.get_last_organ_in())
targ.vore_transform_index=-200
//targ.last_organ_in.owner<<"You feel a stir. An occupant has changed."
targ.last_organ_in.flavour_text(targ.last_organ_in.FLAVOUR_TRANSFORM)
/mob/living/proc/vore_dna_mod(var/new_dna)
if(!has_dna(src))return
if(!new_dna)return
var/mob/living/carbon/C=src
if(istype(new_dna,/datum/dna))
var/old_name=C.real_name
var/datum/dna/change_dna=new_dna
C.dna.struc_enzymes=change_dna.struc_enzymes
//C.dna.unique_enzymes=change_dna.unique_enzymes
C.dna.uni_identity=change_dna.uni_identity
C.set_mutantrace(change_dna.species.id)
C.dna.mutanttail=change_dna.mutanttail
C.dna.mutantwing=change_dna.mutantwing
C.dna.special_color=change_dna.special_color
C.dna.special_color=change_dna.special_color
C.updateappearance()
C.real_name=old_name
C.name=old_name
else
//C.dna.mutantrace=new_dna
C.set_mutantrace(new_dna)
/*
/mob/living/proc/vore_transform(var/transformpath=null, var/transform_species=null, var/transform_gender=NEUTER, var/datum/vore_organ/new_cont=null)
var/old_name=src.real_name
var/datum/dna/tmp_dna=check_dna_integrity(src)
if(tmp_dna)
last_working_dna=tmp_dna
if(!transformpath)transformpath=src.type
if(src.type==transformpath)
if(istype(src,/mob/living/carbon))
var/mob/living/carbon/humz=src
var/race = humz.dna ? humz.dna.mutantrace : null
if((transform_species&&race==transform_species)&&(gender==transform_gender||transform_gender==NEUTER))
return 0
else
if(humz.dna)
humz.vore_dna_mod(transform_species)
if(transform_gender!=NEUTER)
humz.gender=transform_gender
if(istype(humz,/mob/living/carbon/human))
var/mob/living/carbon/human/H=humz
H.update_body()
if(new_cont)
humz.vore_transform_index=-200
new_cont.owner<<"Your belly stirs. A transformation is complete."
return 1
else
if(transform_gender!=NEUTER&&gender!=transform_gender)
gender=transform_gender
if(new_cont)
vore_transform_index=-200
new_cont.owner<<"Your belly stirs. A transformation is complete."
return 1
return 0
src.vore_contents_drop(new_cont)
var/mob/living/new_mob = new transformpath(src.loc)
if(istype(new_mob))
check_dna_integrity(new_mob)
new_mob.a_intent = "harm"
new_mob.universal_speak = 1
//new_mob.universal_understand = 1
if(src.mind)
src.mind.transfer_to(new_mob)
if(last_working_dna)
new_mob.last_working_dna=last_working_dna
else
new_mob.key = src
if(new_cont)
new_cont.contents.Add(new_mob)
new_cont.owner.stomach_contents.Add(new_mob)
new_mob.vore_transform_index=-200
new_cont.owner<<"Your belly stirs. A transformation is complete."
if(istype(new_mob,/mob/living/carbon))
var/mob/living/carbon/humz=new_mob
humz.dna=humz.last_working_dna
if(transform_species)
humz.vore_dna_mod(transform_species)
if(transform_gender!=NEUTER)
new_mob.gender=transform_gender
if(istype(humz,/mob/living/carbon/human))
var/mob/living/carbon/human/H=humz
H.update_body()
if(transform_gender!=NEUTER)
new_mob.gender=transform_gender
new_mob.real_name=old_name
new_mob.name=old_name
qdel(src)
return 1
*/
/mob/living/egg
name = "egg"
icon = 'icons/mob/animal.dmi'
icon_state = "egg"
health = 50
//max_health = 50
status_flags = CANPUSH
languages_spoken = 1
languages_understood = 1
canmove = 0
var/datum/vore_transform_datum/hatch_tf = null
var/hatch_prog = 0
var/targ_hatch = 80
var/incubating=0
proc/incubate()
incubating=1
update_canmove()
canmove=0
return canmove
New()
..()
icon_state="egg[rand(0,2)]"
Life()
vore_transform_index=-200
if(incubating)
if(get_last_organ_in())
hatch_prog+=2
else
hatch_prog+=1
if(hatch_prog>=targ_hatch&&hatch_tf)
src.visible_message("<span class='notice'>[src]'s egg hatches!</span>")
hatch_tf.apply_transform(src)
attack_hand(mob/living/carbon/human/M as mob)
..()
switch(M.a_intent)
if("help")
if (health > 0)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.eye_blind )))
O.show_message("\blue [M] hugs [src]'s egg.")
if("grab")
if (M == src || anchored)
return
if (!(status_flags & CANPUSH))
return
LAssailant = M
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.eye_blind )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
if("harm", "disarm")
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.eye_blind )))
O.show_message("\red [M] taps [src]'s eggshell!")
return

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
/**
* Additional variables that must be defined on /mob/living/carbon/human
* for use in code that is part of the vore modules.
*
* These variables are declared here (separately from the normal human_defines.dm)
* in order to isolate VOREStation changes and ease merging of other codebases.
*/
// Additional vars
/mob/living/carbon/human
// Horray Furries!
var/datum/sprite_accessory/ears/ear_style = null
var/datum/sprite_accessory/tail/tail_style = null
var/r_tail = 30
var/g_tail = 30
var/b_tail = 30
// Custom Species Name
var/custom_species

View File

@@ -0,0 +1,44 @@
// ---------------------------------------------
// -!-!-!-!-!-!-!-!- READ ME -!-!-!-!-!-!-!-!-!-
// ---------------------------------------------
//Beep beep hello
//
//Use this file to define the exclusive abilities of the spidertaur folk
//
//ahuhuhuhu
//-Antsnap
obj/item/clothing/suit/web_bindings
icon = 'icons/obj/clothing/suits.dmi'
name = "web bindings"
desc = "A webbed cocoon that completely restrains the wearer."
icon_state = "web_bindings"
item_state = "web_bindings"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
/* //Commenting all this out, as people keep abusing it. Sorry!
mob/proc/weaveWeb()
set name = "Weave Web"
set category = "Species Powers"
if(nutrition >= 500) //People decided to abuse it. Sorry. It was asked to be made so it couldn't be spammed, and what do ya know, people are spamming it everywhere.
src.visible_message("<span class='notice'>\the [src] weaves a web from their spinneret silk.</span>")
nutrition -= 500
spawn(30) //3 seconds to form
new /obj/effect/spider/stickyweb(src.loc)
else
src << "You do not have enough nutrition to create webbing!"
*/
mob/proc/weaveWebBindings()
set name = "Weave Web Bindings"
set category = "Species Powers"
if(nutrition >= 30) //This isn't a huge problem. This is so you can bind people up.
src.visible_message("<span class='notice'>\the [src] pulls silk from their spinneret and delicately weaves it into bindings.</span>")
nutrition -= 30
spawn(30) //5 seconds to weave the bindings~
var/obj/item/clothing/suit/web_bindings/bindings = new() //This sprite is amazing, I must say.
src.put_in_hands(bindings)
else
src << "You do not have enough nutrition to create webbing!" //CK~

View File

@@ -0,0 +1,645 @@
/*
Hello and welcome to VOREStation sprite_accessories: For a more general overview
please read sprite_accessories.dm. This file is for ears, tails, and taur bodies!
This is intended to be friendly for people with little to no actual coding experience.
!!WARNING!!: changing existing accessory information can be VERY hazardous to savefiles,
to the point where you may completely corrupt a server's savefiles. Please refrain
from doing this unless you absolutely know what you are doing, and have defined a
conversion in savefile.dm
*/
// Add Additional variable onto sprite_accessory
/datum/sprite_accessory
// Ckey of person allowed to use this, if defined.
var/list/ckeys_allowed = null
/*
////////////////////////////
/ =--------------------= /
/ == Ear Definitions == /
/ =--------------------= /
////////////////////////////
*/
/datum/sprite_accessory/ears
name = "You should not see this..."
icon = 'icons/mob/vore/ears_vr.dmi'
do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
var/extra_overlay // Icon state of an additional overlay to blend in.
var/desc = "You should not see this..."
// Ears avaliable to anyone
/datum/sprite_accessory/ears/squirrel_orange
name = "squirel, orange"
desc = ""
icon_state = "squirrel-orange"
/datum/sprite_accessory/ears/squirrel_red
name = "squirrel, red"
desc = ""
icon_state = "squirrel-red"
/datum/sprite_accessory/ears/bunny_white
name = "bunny, white"
desc = ""
icon_state = "bunny"
/datum/sprite_accessory/ears/bear_brown
name = "bear, brown"
desc = ""
icon_state = "bear-brown"
/datum/sprite_accessory/ears/wolf_grey
name = "wolf, grey"
desc = ""
icon_state = "wolf-grey"
/datum/sprite_accessory/ears/wolf_green
name = "wolf, green"
desc = ""
icon_state = "wolf-green"
/datum/sprite_accessory/ears/wisewolf
name = "wolf, wise"
desc = ""
icon_state = "wolf-wise"
/datum/sprite_accessory/ears/mouse_grey
name = "mouse, grey"
desc = ""
icon_state = "mouse-grey"
/datum/sprite_accessory/ears/bee
name = "bee antennae"
desc = ""
icon_state = "bee"
/datum/sprite_accessory/ears/oni_h1
name = "oni horns"
desc = ""
icon_state = "oni-h1"
/datum/sprite_accessory/ears/demon_horns1
name = "demon horns"
desc = ""
icon_state = "demon-horns1"
/datum/sprite_accessory/ears/foxears
name = "highlander zorren ears"
desc = ""
icon_state = "foxears"
/datum/sprite_accessory/ears/fenears
name = "flatland zorren ears"
desc = ""
icon_state = "fenears"
/datum/sprite_accessory/ears/sergal
name = "Sergal ears"
icon_state = "serg_plain_s"
/datum/sprite_accessory/ears/foxearshc
name = "highlander zorren ears, colorable"
desc = ""
icon_state = "foxearshc"
do_colouration = 1
/datum/sprite_accessory/ears/fenearshc
name = "flatland zorren ears, colorable"
desc = ""
icon_state = "fenearshc"
do_colouration = 1
/datum/sprite_accessory/ears/sergalhc
name = "Sergal ears, colorable"
icon_state = "serg_plain_s"
do_colouration = 1
/datum/sprite_accessory/ears/mousehc
name = "mouse, colorable"
desc = ""
icon_state = "mouse"
do_colouration = 1
extra_overlay = "mouseinner"
/datum/sprite_accessory/ears/wolfhc
name = "wolf, colorable"
desc = ""
icon_state = "wolf"
do_colouration = 1
extra_overlay = "wolfinner"
/datum/sprite_accessory/ears/bearhc
name = "bear, colorable"
desc = ""
icon_state = "bear"
do_colouration = 1
/datum/sprite_accessory/ears/squirrelhc
name = "squirrel, colorable"
desc = ""
icon_state = "squirrel"
do_colouration = 1
/datum/sprite_accessory/ears/kittyhc
name = "kitty, colorable"
desc = ""
icon_state = "kitty"
do_colouration = 1
extra_overlay = "kittyinner"
/datum/sprite_accessory/ears/bunnyhc
name = "bunny, colorable"
desc = ""
icon_state = "bunny"
do_colouration = 1
// Special snowflake ears go below here.
/datum/sprite_accessory/ears/molenar_kitsune
name = "quintail kitsune ears (Molenar)"
desc = ""
icon_state = "molenar-kitsune"
ckeys_allowed = list("molenar")
/datum/sprite_accessory/ears/molenar_deathclaw
name = "deathclaw ears (Molenar)"
desc = ""
icon_state = "molenar-deathclaw"
ckeys_allowed = list("molenar")
/datum/sprite_accessory/ears/runac
name = "fennecsune ears (Runac)"
desc = ""
icon_state = "runac"
ckeys_allowed = list("rebcom1807")
/datum/sprite_accessory/ears/kerena
name = "wingwolf ears (Kerena)"
desc = ""
icon_state = "kerena"
ckeys_allowed = list("somekindofpony")
/datum/sprite_accessory/ears/rosey
name = "tritail kitsune ears (Rosey)"
desc = ""
icon_state = "rosey"
ckeys_allowed = list("joey4298")
/datum/sprite_accessory/ears/aronai
name = "aronai ears/head (Aronai)"
desc = ""
icon_state = "aronai"
ckeys_allowed = list("arokha")
/*
////////////////////////////
/ =--------------------= /
/ == Tail Definitions == /
/ =--------------------= /
////////////////////////////
*/
/datum/sprite_accessory/tail
name = "You should not see this..."
icon = 'icons/mob/vore/tails_vr.dmi'
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
var/extra_overlay // Icon state of an additional overlay to blend in.
var/show_species_tail = 0 // If false, do not render species' tail.
var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it
var/desc = "You should not see this..."
/datum/sprite_accessory/tail/invisible
name = "hide species-sprite tail"
icon = null
icon_state = null
/datum/sprite_accessory/tail/squirrel_orange
name = "squirel, orange"
desc = ""
icon_state = "squirrel-orange"
/datum/sprite_accessory/tail/squirrel_red
name = "squirrel, red"
desc = ""
icon_state = "squirrel-red"
/datum/sprite_accessory/tail/squirrel
name = "squirrel, colorable"
desc = ""
icon_state = "squirrel"
do_colouration = 1
/datum/sprite_accessory/tail/kitty
name = "kitty, colorable, downwards"
desc = ""
icon_state = "kittydown"
do_colouration = 1
/datum/sprite_accessory/tail/kittyup
name = "kitty, colorable, upwards"
desc = ""
icon_state = "kittyup"
do_colouration = 1
/datum/sprite_accessory/tail/tiger_white
name = "tiger, colorable, white stripes"
desc = ""
icon_state = "tiger"
do_colouration = 1
extra_overlay = "tigerinnerwhite"
/datum/sprite_accessory/tail/tiger_black
name = "tiger, colorable, black stripes"
desc = ""
icon_state = "tiger"
do_colouration = 1
extra_overlay = "tigerinnerblack"
/datum/sprite_accessory/tail/stripey
name = "stripey taj, colorable"
desc = ""
icon_state = "stripeytail"
do_colouration = 1
/datum/sprite_accessory/tail/stripeytail_brown
name = "stripey taj, brown"
desc = ""
icon_state = "stripeytail-brown"
/datum/sprite_accessory/tail/bunny
name = "bunny, colorable"
desc = ""
icon_state = "bunny"
do_colouration = 1
/datum/sprite_accessory/tail/mothc
name = "moth wings, colorable"
desc = ""
icon_state = "moth"
do_colouration = 1
/datum/sprite_accessory/tail/moth
name = "moth wings"
desc = ""
icon_state = "moth"
/datum/sprite_accessory/tail/bear_brown
name = "bear, brown"
desc = ""
icon_state = "bear-brown"
/datum/sprite_accessory/tail/bear
name = "bear, colorable"
desc = ""
icon_state = "bear"
do_colouration = 1
/datum/sprite_accessory/tail/wolf_grey
name = "wolf, grey"
desc = ""
icon_state = "wolf-grey"
/datum/sprite_accessory/tail/wolf_green
name = "wolf, green"
desc = ""
icon_state = "wolf-green"
/datum/sprite_accessory/tail/wisewolf
name = "wolf, wise"
desc = ""
icon_state = "wolf-wise"
/datum/sprite_accessory/tail/blackwolf
name = "wolf, black"
desc = ""
icon_state = "wolf"
/datum/sprite_accessory/tail/wolf
name = "wolf, colorable"
desc = ""
icon_state = "wolf"
do_colouration = 1
extra_overlay = "wolfinner"
/datum/sprite_accessory/tail/mouse_grey
name = "mouse, grey"
desc = ""
icon_state = "mouse-grey"
/datum/sprite_accessory/tail/crossfox
name = "cross fox"
desc = ""
icon_state = "crossfox"
/datum/sprite_accessory/tail/mouse
name = "mouse, colorable"
desc = ""
icon_state = "mouse"
do_colouration = 1
extra_overlay = "mouseinner"
/datum/sprite_accessory/tail/bee
name = "bee thorax (+wings)"
desc = ""
icon_state = "bee"
/datum/sprite_accessory/tail/moth_full
name = "moth antenna and wings"
desc = ""
icon_state = "moth_full"
/datum/sprite_accessory/tail/succubus_purple
name = "succubus, purple (+wings)"
desc = ""
icon_state = "succubus-purple"
/datum/sprite_accessory/tail/succubus_red
name = "succubus, red (+wings)"
desc = ""
icon_state = "succubus-red"
/datum/sprite_accessory/tail/succubus_black
name = "succubus, black (+wings)"
desc = ""
icon_state = "succubus-black"
/datum/sprite_accessory/tail/bat_black
name = "bat wings, black"
desc = ""
icon_state = "bat-black"
show_species_tail = 1
/datum/sprite_accessory/tail/bat_red
name = "bat wings, red"
desc = ""
icon_state = "bat-red"
show_species_tail = 1
/datum/sprite_accessory/tail/snag
name = "xenomorph tail w/ backplate"
desc = ""
icon_state = "snag"
/datum/sprite_accessory/tail/xenotail
name = "xenomorph tail"
desc = ""
icon_state = "xenotail"
/datum/sprite_accessory/tail/molenar_kitsune
name = "quintail kitsune tails (Molenar)"
desc = ""
icon_state = "molenar-kitsune"
ckeys_allowed = list("molenar")
/datum/sprite_accessory/tail/molenar_deathclaw
name = "deathclaw bits (Molenar)"
desc = ""
icon_state = "molenar-deathclaw"
ckeys_allowed = list("molenar","jertheace")
/datum/sprite_accessory/tail/runac
name = "fennecsune tails (Runac)"
desc = ""
icon_state = "runac"
ckeys_allowed = list("rebcom1807")
/datum/sprite_accessory/tail/kerena
name = "wingwolf tail (+wings) (Kerena)"
desc = ""
icon_state = "kerena"
ckeys_allowed = list("somekindofpony")
/datum/sprite_accessory/tail/rosey
name = "tritail kitsune tails (Rosey)"
desc = ""
icon_state = "rosey"
ckeys_allowed = list("joey4298")
/datum/sprite_accessory/tail/scree
name = "green taj tail (+wings) (Scree)"
desc = ""
icon_state = "scree"
ckeys_allowed = list("scree")
/datum/sprite_accessory/tail/aronai
name = "aronai tail (Aronai)"
desc = ""
icon_state = "aronai"
ckeys_allowed = list("arokha")
/datum/sprite_accessory/tail/feathered
name = "feathered wings"
desc = ""
icon_state = "feathered"
//For all species tails. Includes haircolored tails.
/datum/sprite_accessory/tail/special
name = "Blank tail. Do not select."
icon = 'icons/effects/species_tails_vr.dmi'
/datum/sprite_accessory/tail/special/unathi
name = "unathi tail"
desc = ""
icon_state = "sogtail_s"
/datum/sprite_accessory/tail/special/tajaran
name = "tajaran tail"
desc = ""
icon_state = "tajtail_s"
/datum/sprite_accessory/tail/special/sergal
name = "sergal tail"
desc = ""
icon_state = "sergtail_s"
/datum/sprite_accessory/tail/special/akula
name = "akula tail"
desc = ""
icon_state = "sharktail_s"
/datum/sprite_accessory/tail/special/nevrean
name = "nevrean tail"
desc = ""
icon_state = "nevreantail_s"
/datum/sprite_accessory/tail/special/armalis
name = "armalis tail"
desc = ""
icon_state = "armalis_tail_humanoid_s"
/datum/sprite_accessory/tail/special/xenodrone
name = "xenomorph drone tail"
desc = ""
icon_state = "xenos_drone_tail_s"
/datum/sprite_accessory/tail/special/xenosentinel
name = "xenomorph sentinel tail"
desc = ""
icon_state = "xenos_sentinel_tail_s"
/datum/sprite_accessory/tail/special/xenohunter
name = "xenomorph hunter tail"
desc = ""
icon_state = "xenos_hunter_tail_s"
/datum/sprite_accessory/tail/special/xenoqueen
name = "xenomorph queen tail"
desc = ""
icon_state = "xenos_queen_tail_s"
/datum/sprite_accessory/tail/special/monkey
name = "monkey tail"
desc = ""
icon_state = "chimptail_s"
/datum/sprite_accessory/tail/special/seromitail
name = "seromi tail"
desc = ""
icon_state = "seromitail_s"
/datum/sprite_accessory/tail/special/seromitailfeathered
name = "seromi tail w/ feathers"
desc = ""
icon_state = "seromitail_feathers_s"
/datum/sprite_accessory/tail/special/unathihc
name = "unathi tail, colorable"
desc = ""
icon_state = "sogtail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/tajaranhc
name = "tajaran tail, colorable"
desc = ""
icon_state = "tajtail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/sergalhc
name = "sergal tail, colorable"
desc = ""
icon_state = "sergtail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/akulahc
name = "akula tail, colorable"
desc = ""
icon_state = "sharktail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/nevreanhc
name = "nevrean tail, colorable"
desc = ""
icon_state = "nevreantail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/foxhc
name = "highlander zorren tail, colorable"
desc = ""
icon_state = "foxtail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/fennechc
name = "flatland zorren tail, colorable"
desc = ""
icon_state = "fentail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/armalishc
name = "armalis tail, colorable"
desc = ""
icon_state = "armalis_tail_humanoid_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/xenodronehc
name = "xenomorph drone tail, colorable"
desc = ""
icon_state = "xenos_drone_tail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/xenosentinelhc
name = "xenomorph sentinel tail, colorable"
desc = ""
icon_state = "xenos_sentinel_tail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/xenohunterhc
name = "xenomorph hunter tail, colorable"
desc = ""
icon_state = "xenos_hunter_tail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/xenoqueenhc
name = "xenomorph queen tail, colorable"
desc = ""
icon_state = "xenos_queen_tail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/monkeyhc
name = "monkey tail, colorable, colorable"
desc = ""
icon_state = "chimptail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/seromitailhc
name = "seromi tail, colorable"
desc = ""
icon_state = "seromitail_hc_s"
do_colouration = 1
/datum/sprite_accessory/tail/special/seromitailfeatheredhc
name = "seromi tail w/ feathers, colorable"
desc = ""
icon_state = "seromitail_feathers_hc_s"
do_colouration = 1
/*
////////////////////////////
/ =--------------------= /
/ == Taur Definitions == /
/ =--------------------= /
////////////////////////////
*/
// Taur sprites are now a subtype of tail since they are mutually exclusive anyway.
/datum/sprite_accessory/tail/taur
name = "You should not see this..."
icon = 'icons/mob/vore/taurs_vr.dmi'
do_colouration = 1 // Yes color, using tail color
color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY
/datum/sprite_accessory/tail/taur/wolf
name = "Wolf"
icon_state = "wolf_s"
/datum/sprite_accessory/tail/taur/naga
name = "Naga"
icon_state = "naga_s"
/datum/sprite_accessory/tail/taur/horse
name = "Horse"
icon_state = "horse_s"
/datum/sprite_accessory/tail/taur/cow
name = "Cow"
icon_state = "cow_s"
/datum/sprite_accessory/tail/taur/lizard
name = "Lizard"
icon_state = "lizard_s"
/datum/sprite_accessory/tail/taur/spider
name = "Spider"
icon_state = "spider_s"
/datum/sprite_accessory/tail/taur/tents
name = "Tentacles"
icon_state = "tent_s"

View File

@@ -0,0 +1,36 @@
#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur)
/mob/living/carbon/human/proc/get_ears_overlay()
if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state)
if(ear_style.do_colouration)
ears_s.Blend(rgb(src.r_hair, src.g_hair, src.b_hair), ear_style.color_blend_mode)
if(ear_style.extra_overlay)
var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay)
ears_s.Blend(overlay, ICON_OVERLAY)
return ears_s
return null
/mob/living/carbon/human/proc/get_tail_image()
//If you are FBP with tail style
if(synthetic && synthetic.includes_tail)
var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail")
return image(tail_s)
//If you have a custom tail selected
if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style)))
var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.icon_state)
if(tail_style.do_colouration)
tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
if(tail_style.extra_overlay)
var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay)
tail_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
if(isTaurTail(tail_style))
return image(tail_s, "pixel_x" = -16)
else
return image(tail_s)
return null

View File

@@ -0,0 +1,419 @@
//
// The belly object is what holds onto a mob while they're inside a predator.
// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc.
//
// If you change what variables are on this, then you need to update the copy() proc.
//
// Parent type of all the various "belly" varieties.
//
/datum/belly
var/name // Name of this location
var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
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/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/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/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
var/list/struggle_messages_outside = list(
"%pred's %belly wobbles with a squirming meal.",
"%pred's %belly jostles with movement.",
"%pred's %belly briefly swells outward as someone pushes from inside.",
"%pred's %belly fidgets with a trapped victim.",
"%pred's %belly jiggles with motion from inside.",
"%pred's %belly sloshes around.",
"%pred's %belly gushes softly.",
"%pred's %belly lets out a wet squelch.")
var/list/struggle_messages_inside = list(
"Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
"Your struggles only cause %pred's %belly to gush softly around you.",
"Your movement only causes %pred's %belly to slosh around you.",
"Your motion causes %pred's %belly to jiggle.",
"You fidget around inside of %pred's %belly.",
"You shove against the walls of %pred's %belly, making it briefly swell outward.",
"You jostle %pred's %belly with movement.",
"You squirm inside of %pred's %belly, making it wobble around.")
var/list/digest_messages_owner = list(
"You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
"You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
"Your %belly lets out a rumble as it melts %prey into sludge.",
"You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
"Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
"Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
"Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
"Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
"Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
"Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
var/list/digest_messages_prey = list(
"Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
"%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
"%pred's %belly lets out a rumble as it melts you into sludge.",
"%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
"%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
"%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
"%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
"%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
"%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
"%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
var/list/examine_messages = list(
"They have something solid in their %belly!",
"It looks like they have something in their %belly!")
//Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
//a carbon's belly if someone really wanted. No UI for carbons to adjust this.
//List has indexes that are the digestion mode strings, and keys that are lists of strings.
var/list/emote_lists = list()
// Constructor that sets the owning mob
/datum/belly/New(var/mob/living/owning_mob)
owner = owning_mob
// Toggle digestion on/off and notify user of the new setting.
// If multiple digestion modes are avaliable (i.e. unbirth) then user should be prompted.
/datum/belly/proc/toggle_digestion()
return
// Checks if any mobs are present inside the belly
// return True if the belly is empty.
/datum/belly/proc/is_empty()
return internal_contents.len == 0
// Release all contents of this belly into the owning mob's location.
// 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()
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
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
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
return 1
// Release a specific atom from the contents of this belly into the owning mob's location.
// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
// Returns the number of atoms so released.
/datum/belly/proc/release_specific_contents(var/atom/movable/M)
if (!(M in internal_contents))
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
var/datum/belly/B = check_belly(owner)
if(B)
B.internal_contents += M
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
owner.update_icons()
return 1
// Actually perform the mechanics of devouring the tasty prey.
// The purpose of this method is to avoid duplicate code, and ensure that all necessary
// steps are taken.
/datum/belly/proc/nom_mob(var/mob/prey, var/mob/user)
// if (prey.buckled)
// prey.buckled.unbuckle_mob()
// Super super messy. prey.forceMove.owner doesn't work if there's no prey.
prey.loc = owner
internal_contents |= prey
if(inside_flavor)
prey << "<span class='notice'><B>[inside_flavor]</B></span>"
// Get the line that should show up in Examine message if the owner of this belly
// is examined. By making this a proc, we not only take advantage of polymorphism,
// but can easily make the message vary based on how many people are inside, etc.
// Returns a string which shoul be appended to the Examine output.
/datum/belly/proc/get_examine_msg()
if(internal_contents.len && examine_messages.len)
var/formatted_message
var/raw_message = pick(examine_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
return("<span class='warning'>[formatted_message]</span><BR>")
// The next function gets the messages set on the belly, in human-readable format.
// This is useful in customization boxes and such. The delimiter right now is \n\n so
// in message boxes, this looks nice and is easily delimited.
/datum/belly/proc/get_messages(var/type, var/delim = "\n\n")
ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
var/list/raw_messages
switch(type)
if("smo")
raw_messages = struggle_messages_outside
if("smi")
raw_messages = struggle_messages_inside
if("dmo")
raw_messages = digest_messages_owner
if("dmp")
raw_messages = digest_messages_prey
if("em")
raw_messages = examine_messages
var/messages = list2text(raw_messages,delim)
return messages
// The next function sets the messages on the belly, from human-readable var
// replacement strings and linebreaks as delimiters (two \n\n by default).
// They also sanitize the messages.
/datum/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
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
raw_list[i] = replacetext(raw_list[i],"&#37;","%")
ASSERT(raw_list.len <= 10) //Sanity
switch(type)
if("smo")
struggle_messages_outside = raw_list
if("smi")
struggle_messages_inside = raw_list
if("dmo")
digest_messages_owner = raw_list
if("dmp")
digest_messages_prey = raw_list
if("em")
examine_messages = raw_list
return
// Handle the death of a mob via digestion.
// 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)
is_full = 1
M.death(1)
internal_contents -= 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]"
//Drop all items into the belly.
if (config.items_survive_digestion)
for (var/obj/item/W in M)
_handle_digested_item(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)
// 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)
if(owner.stat || escapable) //If owner is stat (dead, KO) we can actually escape, or if belly is set to escapable (non-default)
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>"
if(do_after(R, escapetime, owner))
if((owner.stat || escapable) && (R in internal_contents)) //Can still escape?
release_specific_contents(R)
return
else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable or mob revived
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
return
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
var/strpick = pick(struggle_sounds)
var/strsound = struggle_sounds[strpick]
playsound(R.loc, strsound, 50, 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(!(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)
// Belly copies and then returns the copy
// Needs to be updated for any var changes
/datum/belly/proc/copy(mob/new_owner)
var/datum/belly/dupe = new /datum/belly(new_owner)
//// Non-object variables
dupe.name = name
dupe.inside_flavor = inside_flavor
dupe.vore_sound = vore_sound
dupe.vore_verb = vore_verb
dupe.human_prey_swallow_time = human_prey_swallow_time
dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
dupe.emoteTime = emoteTime
dupe.digest_brute = digest_brute
dupe.digest_burn = digest_burn
dupe.digest_tickrate = digest_tickrate
dupe.immutable = immutable
dupe.escapable = escapable
dupe.escapetime = escapetime
//// Object-holding variables
//struggle_messages_outside - strings
dupe.struggle_messages_outside.Cut()
for(var/I in struggle_messages_outside)
dupe.struggle_messages_outside += I
//struggle_messages_inside - strings
dupe.struggle_messages_inside.Cut()
for(var/I in struggle_messages_inside)
dupe.struggle_messages_inside += I
//digest_messages_owner - strings
dupe.digest_messages_owner.Cut()
for(var/I in digest_messages_owner)
dupe.digest_messages_owner += I
//digest_messages_prey - strings
dupe.digest_messages_prey.Cut()
for(var/I in digest_messages_prey)
dupe.digest_messages_prey += I
//examine_messages - strings
dupe.examine_messages.Cut()
for(var/I in examine_messages)
dupe.examine_messages += I
//emote_lists - index: digest mode, key: list of strings
dupe.emote_lists.Cut()
for(var/K in emote_lists)
dupe.emote_lists[K] = list()
for(var/I in emote_lists[K])
dupe.emote_lists[K] += I
return dupe

View File

@@ -0,0 +1,127 @@
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
// Called from /mob/living/Life() proc.
/datum/belly/proc/process_Life()
/////////////////////////// Auto-Emotes ///////////////////////////
if((digest_mode in emote_lists) && !emotePend)
emotePend = 1
spawn(emoteTime)
var/list/EL = emote_lists[digest_mode]
for(var/mob/living/M in internal_contents)
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
//////////////////////////// DM_DIGEST ////////////////////////////
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)
for (var/mob/living/M in internal_contents)
//Pref protection!
if (!M.digestable)
continue
//Person just died in guts!
if(M.stat == DEAD && M.getFireLoss() >= 150)
var/digest_alert_owner = pick(digest_messages_owner)
var/digest_alert_prey = pick(digest_messages_prey)
//Replace placeholder vars
digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
//Send messages
owner << "<span class='notice'>" + digest_alert_owner + "</span>"
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
digestion_death(M)
continue
// Deal digestion damage (and feed the pred)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
owner.nutrition += 10
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)
for (var/mob/living/M in internal_contents)
//Pref protection!
if (!M.digestable)
continue
//Person just died in guts!
if(M.stat == DEAD && M.getFireLoss() >= 150)
var/digest_alert_owner = pick(digest_messages_owner)
var/digest_alert_prey = pick(digest_messages_prey)
//Replace placeholder vars
digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
//Send messages
owner << "<span class='notice'>" + digest_alert_owner + "</span>"
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
digestion_death(M)
continue
// Deal digestion damage (and feed the pred)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(2)
M.adjustFireLoss(3)
owner.nutrition += 10
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)
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
return

View File

@@ -0,0 +1,341 @@
///////////////////// Mob Living /////////////////////
/mob/living
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
//
// Handle being clicked, perhaps with something to devour
//
// Refactored to use centralized vore code system - Leshana
// Critical adjustments due to TG grab changes - Poojawa
/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey)
if(!user)
return
if(!prey)
return
if(prey==user)
return
if(prey == src && user.zone_selected == "mouth") //you click your target
if(!is_vore_predator(prey))
user << "<span class='notice'>They aren't voracious enough.</span>"
feed_self_to_grabbed(user)
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)
else // click someone other than you/prey
if(!is_vore_predator(src))
user << "<span class='notice'>They aren't voracious enough.</span>"
return
feed_grabbed_to_other(user)
//
// Eating procs depending on who clicked what
//
/mob/living/proc/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey)
var/belly = user.vore_selected
return perform_the_nom(prey, user, prey, belly)
/*
/mob/living/proc/eat_held_mob(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
var/belly
if(user != pred)
belly = input("Choose Belly") in pred.vore_organs
else
belly = pred.vore_selected
return perform_the_nom(user, prey, pred, belly)*/
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred)
var/belly = input("Choose Belly") in pred.vore_organs
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
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, prey, pred, belly)
//
// Master vore proc that actually does vore procedures
//
/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
// The belly selected at the time of noms
var/datum/belly/belly_target = pred.vore_organs[belly]
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
// Prepare messages
if(user == pred) //Feeding someone to yourself
attempt_msg = text("<span class='warning'>[] is attemping to [] [] into their []!</span>",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
success_msg = text("<span class='warning'>[] manages to [] [] into their []!</span>",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
else //Feeding someone to another person
attempt_msg = text("<span class='warning'>[] is attempting to make [] [] [] into their []!</span>",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
success_msg = text("<span class='warning'>[] manages to make [] [] [] into their []!</span>",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
// Announce that we start the attempt!
user.visible_message(attempt_msg)
// 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.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
playsound(user, belly_target.vore_sound, 100, 1)
// Actually shove prey into the belly.
belly_target.nom_mob(prey, user)
// user.update_icons()
stop_pulling()
// Inform Admins
if (pred == user)
message_admins("[key_name(pred)] ate [key_name(prey)]. ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
log_attack("[key_name(pred)] ate [key_name(prey)]")
else if (prey == !client && stat != DEAD)
message_admins("[key_name(pred)] ate [key_name(prey)] (braindead) ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
log_attack("[key_name(pred)] ate [key_name(prey)] (braindead)")
else
message_admins("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)]. ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
log_attack("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)].")
return 1
//
//End vore code.
/*
//Handle case: /obj/item/weapon/holder
if(/obj/item/weapon/holder/micro)
var/obj/item/weapon/holder/H = I
if(!isliving(user)) return 0 // Return 0 to continue upper procs
var/mob/living/attacker = user // Typecast to living
if (is_vore_predator(src))
for (var/mob/living/M in H.contents)
attacker.eat_held_mob(attacker, M, src)
return 1 //Return 1 to exit upper procs
else
log_attack("[attacker] attempted to feed [H.contents] to [src] ([src.type]) but it failed.")
// I just can't imagine this not being complained about
//Handle case: /obj/item/device/radio/beacon
if(/obj/item/device/radio/beacon)
var/confirm = alert(user, "[src == user ? "Eat the beacon?" : "Feed the beacon to [src]?"]", "Confirmation", "Yes!", "Cancel")
if(confirm == "Yes!")
var/bellychoice = input("Which belly?","Select A Belly") in src.vore_organs
var/datum/belly/B = src.vore_organs[bellychoice]
src.visible_message("<span class='warning'>[user] is trying to stuff a beacon into [src]'s [bellychoice]!</span>","<span class='warning'>[user] is trying to stuff a beacon into you!</span>")
if(do_after(user,30,src))
user.drop_item()
I.loc = src
B.internal_contents += I
src.visible_message("<span class='warning'>[src] is fed the beacon!</span>","You're fed the beacon!")
playsound(src, B.vore_sound, 100, 1)
return 1
else
return 1 //You don't get to hit someone 'later'
return 0
*/
//
// Custom resist catches for /mob/living
//
/mob/living/proc/vore_process_resist()
//Are we resisting from inside a belly?
var/datum/belly/B = check_belly(src)
if(B)
spawn() B.relay_resist(src)
return TRUE //resist() on living does this TRUE thing.
//Other overridden resists go here
return 0
//
// Proc for updating vore organs and digestion/healing/absorbing
//
/mob/living/proc/handle_internal_contents()
if(SSair.times_fired%3 != 1)
return //The accursed timer
for (var/I in vore_organs)
var/datum/belly/B = vore_organs[I]
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)
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
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()
set name = "Animal Escape"
set category = "Vore"
//You're in an animal!
if(istype(src.loc,/mob/living/simple_animal))
var/mob/living/simple_animal/pred = src.loc
var/confirm = alert(src, "You're in a mob. Use this as a trick to get out of hostile animals. If you are in more than one pred, use this more than once.", "Confirmation", "Okay", "Cancel")
if(confirm == "Okay")
for(var/I in pred.vore_organs)
var/datum/belly/B = pred.vore_organs[I]
B.release_specific_contents(src)
for(var/mob/living/simple_animal/SA in range(10))
SA.prey_excludes += src
spawn(18000)
if(src && SA)
SA.prey_excludes -= src
pred.update_icons()
else
src << "<span class='alert'>You aren't inside anything, you clod.</span>"

View File

@@ -0,0 +1,39 @@
///////////////////// Simple Animal /////////////////////
/mob/living/simple_animal
var/isPredator = 0 //Are they capable of performing and pre-defined vore actions for their species?
var/swallowTime = 30 //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds.
var/list/prey_excludes = list() //For excluding people from being eaten.
//
// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs.
/*
/mob/living/proc/animal_nom(var/mob/living/T in oview(1))
set name = "Animal Nom"
set category = "Vore"
set desc = "Since you can't grab, you get a verb!"
feed_grabbed_to_self(src,T)
*/
//
// Simple proc for animals to have their digestion toggled on/off externally
//
/mob/living/simple_animal/verb/toggle_digestion()
set name = "Toggle Animal's Digestion"
set desc = "Enables digestion on this mob for 20 minutes."
set category = "Vore"
set src in oview(1)
var/datum/belly/B = vore_organs[vore_selected]
if(faction != usr.faction)
usr << "<span class='warning'>This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.</span>"
return
if(B.digest_mode == "Hold")
var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel")
if(confirm == "Enable")
B.digest_mode = "Digest"
spawn(12000) //12000=20 minutes
if(src) B.digest_mode = "Hold"
else
var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel")
if(confirm == "Disable")
B.digest_mode = "Hold"

View File

@@ -0,0 +1,123 @@
/*
VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE
V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E
V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E
V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E
V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE
V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E
V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E
V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE
V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E
V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E
V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E
VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE
-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
var/digestable = 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
//
/proc/is_vore_predator(var/mob/living/O)
if(istype(O,/mob/living))
if(O.vore_organs.len > 0)
return 1
return 0
//
// Belly searching for simplifying other procs
//
/proc/check_belly(atom/movable/A)
if(istype(A.loc,/mob/living))
var/mob/living/M = A.loc
for(var/I in M.vore_organs)
var/datum/belly/B = M.vore_organs[I]
if(A in B.internal_contents)
return(B)
return 0
/*
// Save/Load Vore Preferences
//
/datum/preferences/proc/load_vore()
if(!client || !client_ckey) return 0 //No client, how can we save?
slot = client.prefs.default_slot
path = client.prefs.path
if(!path) return 0 //Path couldn't be set?
if(!fexists(path)) //Never saved before
save_vore() //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()
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
*/

View File

View File

@@ -0,0 +1,457 @@
//
// Vore management panel for players
//
/mob/living/proc/insidePanel()
set name = "Vore Panel"
set category = "Vore"
var/datum/vore_look/picker_holder = new()
picker_holder.loop = picker_holder
picker_holder.selected = vore_organs[vore_selected]
var/dat = picker_holder.gen_vui(src)
picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
//
// Callback Handler for the Inside form
//
/datum/vore_look
var/datum/belly/selected
var/datum/browser/popup
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
/datum/vore_look/Topic(href,href_list[])
if (vp_interact(href, href_list))
popup.set_content(gen_vui(usr))
usr << output(popup.get_content(), "insidePanel.browser")
/datum/vore_look/proc/gen_vui(var/mob/living/user)
var/dat
if (is_vore_predator(user.loc))
var/mob/living/eater = user.loc
var/datum/belly/inside_belly
//This big block here figures out where the prey is
inside_belly = check_belly(user)
if(inside_belly)
dat += "<font color = 'green'>You are currently inside</font> <font color = 'yellow'>[eater]'s</font> <font color = 'red'>[inside_belly]</font>!<br><br>"
if(inside_belly.inside_flavor)
dat += "[inside_belly.inside_flavor]<br><br>"
if (inside_belly.internal_contents.len > 1)
dat += "You can see the following around you:<br>"
for (var/atom/movable/O in inside_belly.internal_contents)
if(istype(O,/mob/living))
var/mob/living/M = O
//That's just you
if(M == user)
continue
//Anything else
dat += "<a href='?src=\ref[src];outsidepick=\ref[O];outsidebelly=\ref[inside_belly]'>[O]</a>"
else
dat += "You aren't inside anyone."
dat += "<HR>"
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]
if(B == selected)
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'><b>[B.name]</b>"
else
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'>[B.name]"
var/spanstyle
switch(B.digest_mode)
if(DM_HOLD)
spanstyle = ""
if(DM_DIGEST)
spanstyle = "color:red;"
if(DM_DIGESTF)
spanstyle = "color:red;"
if(DM_HEAL)
spanstyle = "color:green;"
dat += "<span style='[spanstyle]'> ([B.internal_contents.len])</span></a></li>"
if(user.vore_organs.len < 10)
dat += "<li style='float: left'><a href='?src=\ref[src];newbelly=1'>New+</a></li>"
dat += "</ol>"
dat += "<HR>"
// Selected Belly (contents, configuration)
if(!selected)
dat += "No belly selected. Click one to select it."
else
if(selected.internal_contents.len > 0)
dat += "<b>Contents:</b> "
for(var/O in selected.internal_contents)
dat += "<a href='?src=\ref[src];insidepick=\ref[O]'>[O]</a>"
//If there's more than one thing, add an [All] button
if(selected.internal_contents.len > 1)
dat += "<a href='?src=\ref[src];insidepick=1;pickall=1'>\[All\]</a>"
dat += "<HR>"
//Belly Name Button
dat += "<a href='?src=\ref[src];b_name=\ref[selected]'>Name:</a>"
dat += " '[selected.name]'"
//Digest Mode Button
dat += "<br><a href='?src=\ref[src];b_mode=\ref[selected]'>Belly Mode:</a>"
dat += " [selected.digest_mode]"
//Belly verb
dat += "<br><a href='?src=\ref[src];b_verb=\ref[selected]'>Vore Verb:</a>"
dat += " '[selected.vore_verb]'"
//Inside flavortext
dat += "<br><a href='?src=\ref[src];b_desc=\ref[selected]'>Flavor Text:</a>"
dat += " '[selected.inside_flavor]'"
//Belly sound
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Set Vore Sound</a>"
dat += "<a href='?src=\ref[src];b_soundtest=\ref[selected]'>Test</a>"
//Belly messages
dat += "<br><a href='?src=\ref[src];b_msgs=\ref[selected]'>Belly Messages</a>"
//Delete button
dat += "<br><a style='background:#990000;' href='?src=\ref[src];b_del=\ref[selected]'>Delete Belly</a>"
dat += "<HR>"
//Under the last HR, save and stuff.
dat += "<a href='?src=\ref[src];saveprefs=1'>Save Prefs</a>"
dat += "<a href='?src=\ref[src];refresh=1'>Refresh</a>"
switch(user.digestable)
if(1)
dat += "<a href='?src=\ref[src];toggledg=1'>Toggle Digestable</a>"
if(0)
dat += "<a href='?src=\ref[src];toggledg=1'><span style='color:green;'>Toggle Digestable</span></a>"
//Returns the dat html to the vore_look
return dat
/datum/vore_look/proc/vp_interact(href, href_list)
var/mob/living/user = usr
for(var/H in href_list)
if(href_list["close"])
del(src) // Cleanup
return
if(href_list["outsidepick"])
var/tgt = locate(href_list["outsidepick"])
var/datum/belly/OB = locate(href_list["outsidebelly"])
var/intent = "Examine"
if(istype(tgt,/mob/living))
var/mob/living/M = tgt
intent = alert("What do you want to do to them?","Query","Examine","Help Out","Devour")
switch(intent)
if("Examine") //Examine a mob inside another mob
M.examine(user)
if("Help Out") //Help the inside-mob out
user << "<font color='green'>You begin to push [M] to freedom!</font>"
M << "[usr] begins to push you to freedom!"
M.loc << "<span class='warning'>Someone is trying to escape from inside you!</span>"
sleep(50)
if(prob(33))
OB.release_specific_contents(M)
usr << "<font color='green'>You manage to help [M] to safety!</font>"
M << "<font color='green'>[user] pushes you free!</font>"
M.loc << "<span class='alert'>[M] forces free of the confines of your body!</span>"
else
user << "<span class='alert'>[M] slips back down inside despite your efforts.</span>"
M << "<span class='alert'> Even with [user]'s help, you slip back inside again.</span>"
M.loc << "<font color='green'>Your body efficiently shoves [M] back where they belong.</font>"
if("Devour") //Eat the inside mob
if(!user.vore_selected)
user << "<span class='warning'>Pick a belly on yourself first!</span>"
return 1
var/datum/belly/TB = user.vore_organs[user.vore_selected]
user << "<span class='warning'>You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>"
M << "<span class='warning'>[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!</span>"
M.loc << "<span class='warning'>Someone inside you is eating someone else!</span>"
sleep(TB.nonhuman_prey_swallow_time)
if((user in OB.internal_contents) && (M in OB.internal_contents))
user << "<span class='warning'>You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>"
M << "<span class='warning'>[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!</span>"
M.loc << "<span class='warning'>Someone inside you has eaten someone else!</span>"
M.loc = user
TB.nom_mob(M)
OB.internal_contents -= M
else if(istype(tgt,/obj/item))
var/obj/item/T = tgt
intent = alert("What do you want to do to that?","Query","Examine","Use Hand")
switch(intent)
if("Examine")
T.examine(user)
if("Use Hand")
if(user.stat)
user << "<span class='warning'>You can't do that in your state!</span>"
return 1
user.ClickOn(T)
sleep(5) //Seems to exit too fast for the panel to update
if(href_list["insidepick"])
var/intent
//Handle the [All] choice. Ugh inelegant. Someone make this pretty.
if(href_list["pickall"])
intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all")
switch(intent)
if("Cancel")
return 1
if("Eject all")
if(user.stat)
user << "<span class='warning'>You can't do that in your state!</span>"
return 1
selected.release_all_contents()
playsound(user, 'sound/effects/splat.ogg', 50, 1)
if("Move all")
if(user.stat)
user << "<span class='warning'>You can't do that in your state!</span>"
return 1
var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
if(choice == "Cancel - Don't Move")
return 1
else
var/datum/belly/B = user.vore_organs[choice]
for(var/atom/movable/tgt in selected.internal_contents)
selected.internal_contents -= tgt
B.internal_contents += tgt
tgt << "<span class='warning'>You're squished from [user]'s [selected] to their [B]!</span>"
for(var/mob/hearer in range(1,user))
hearer << sound('sound/vore/squish2.ogg',volume=80)
return 1
var/atom/movable/tgt = locate(href_list["insidepick"])
intent = "Examine"
intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move")
switch(intent)
if("Examine")
tgt.examine(user)
if("Eject")
if(user.stat)
user << "<span class='warning'>You can't do that in your state!</span>"
return 1
selected.release_specific_contents(tgt)
playsound(user, 'sound/effects/splat.ogg', 50, 1)
if("Move")
if(user.stat)
user << "<span class='warning'>You can't do that in your state!</span>"
return 1
var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
if(choice == "Cancel - Don't Move")
return 1
else
var/datum/belly/B = user.vore_organs[choice]
selected.internal_contents -= tgt
B.internal_contents += tgt
tgt << "<span class='warning'>You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!</span>"
for(var/mob/hearer in range(1,user))
hearer << sound('sound/vore/squish2.ogg',volume=80)
if(href_list["newbelly"])
if(user.vore_organs.len >= 10)
return 1
var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null)
if(length(new_name) > 12 || length(new_name) < 2)
usr << "<span class='warning'>Entered belly name is too long.</span>"
return 0
if(new_name in user.vore_organs)
usr << "<span class='warning'>No duplicate belly names, please.</span>"
return 0
var/datum/belly/NB = new(user)
NB.name = new_name
user.vore_organs[new_name] = NB
selected = NB
if(href_list["bellypick"])
selected = locate(href_list["bellypick"])
user.vore_selected = selected.name
if(href_list["b_name"])
var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null)
if(length(new_name) > 12 || length(new_name) < 2)
usr << "<span class='warning'>Entered belly name length invalid (must be longer than 2, shorter than 12).</span>"
return 0
if(new_name in user.vore_organs)
usr << "<span class='warning'>No duplicate belly names, please.</span>"
return 0
user.vore_organs[new_name] = selected
user.vore_organs -= selected.name
selected.name = new_name
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes
if(selected.digest_modes.len == 1) // Don't do anything
return 1
if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this...
var/index = selected.digest_modes.Find(selected.digest_mode)
switch(index)
if(1)
selected.digest_mode = selected.digest_modes[2]
if(2)
selected.digest_mode = selected.digest_modes[1]
else
selected.digest_mode = input("Choose Mode (currently [selected.digest_mode])") in menu_list
if(href_list["b_desc"])
var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null)
new_desc = readd_quotes(new_desc)
if(length(new_desc) > 1024)
usr << "<span class='warning'>Entered belly desc too long. 1024 character limit.</span>"
return 0
selected.inside_flavor = new_desc
if(href_list["b_msgs"])
var/list/messages = list(
"Digest Message (to prey)",
"Digest Message (to you)",
"Struggle Message (outside)",
"Struggle Message (inside)",
"Examine Message (when full)",
"Reset All To Default",
"Cancel - No Changes"
)
alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.")
var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") in messages
var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name."
switch(choice)
if("Digest Message (to prey)")
var/new_message = input(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",selected.get_messages("dmp")) as message
if(new_message)
selected.set_messages(new_message,"dmp")
if("Digest Message (to you)")
var/new_message = input(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",selected.get_messages("dmo")) as message
if(new_message)
selected.set_messages(new_message,"dmo")
if("Struggle Message (outside)")
var/new_message = input(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",selected.get_messages("smo")) as message
if(new_message)
selected.set_messages(new_message,"smo")
if("Struggle Message (inside)")
var/new_message = input(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",selected.get_messages("smi")) as message
if(new_message)
selected.set_messages(new_message,"smi")
if("Examine Message (when full)")
var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). Do not use %pred or %prey in this type."+help,"Examine Message (when full)",selected.get_messages("em")) as message
if(new_message)
selected.set_messages(new_message,"em")
if("Reset All To Default")
var/confirm = alert(user,"This will delete any custom messages. Are you sure?","Confirmation","DELETE","Cancel")
if(confirm == "DELETE")
selected.digest_messages_prey = initial(selected.digest_messages_prey)
selected.digest_messages_owner = initial(selected.digest_messages_owner)
selected.struggle_messages_outside = initial(selected.struggle_messages_outside)
selected.struggle_messages_inside = initial(selected.struggle_messages_inside)
if("Cancel - No Changes")
return 1
if(href_list["b_verb"])
var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null)
if(length(new_verb) > 12 || length(new_verb) < 2)
usr << "<span class='warning'>Entered verb length invalid (must be longer than 2, shorter than 12).</span>"
return 0
selected.vore_verb = new_verb
if(href_list["b_sound"])
var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in vore_sounds + "Cancel - No Changes"
if(choice == "Cancel")
return 1
selected.vore_sound = vore_sounds[choice]
if(href_list["b_soundtest"])
user << selected.vore_sound
if(href_list["b_del"])
if(selected.internal_contents.len)
usr << "<span class='warning'>Can't delete bellies with contents!</span>"
else if(selected.immutable)
usr << "<span class='warning'>This belly is marked as undeletable.</span>"
else if(user.vore_organs.len == 1)
usr << "<span class='warning'>You must have at least one belly.</span>"
else
var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel")
if(alert == "Delete" && !selected.internal_contents.len)
user.vore_organs -= selected.name
user.vore_organs.Remove(selected)
selected = user.vore_organs[1]
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>"
else
user << "<span class='notice'>Preferences saved!</span>"
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")
switch(choice)
if("Cancel")
return 1
if("Allow Digestion")
user.digestable = 1
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
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return 1

View File

@@ -0,0 +1,124 @@
// BEGIN - DO NOT EDIT PROTOTYPE
/obj/item/weapon/storage/box/fluff
name = "Undefined Fluff Box"
desc = "This should have a description. Tell an admin."
storage_slots = 7
var/list/has_items = list()
/obj/item/weapon/storage/box/fluff/New()
storage_slots = has_items.len
allowed = list()
for(var/P in has_items)
allowed += P
new P(src)
..()
return
// END - DO NOT EDIT PROTOTYPE
/* TEMPLATE
// ckey:Character Name
/obj/item/weapon/storage/box/fluff/charactername
name = ""
desc = ""
has_items = list(
/obj/item/clothing/head/thing1,
/obj/item/clothing/shoes/thing2,
/obj/item/clothing/suit/thing3,
/obj/item/clothing/under/thing4)
*/
//POLARISTODO - These fail to compile since not all items are ported yet
// bwoincognito:Tasald Corlethian
/obj/item/weapon/storage/box/fluff/tasald
name = "Tasald's Kit"
desc = "A kit containing Talsald's equipment."
has_items = list(
/obj/item/clothing/suit/storage/det_suit/fluff/tasald,
/obj/item/clothing/suit/storage/det_suit/fluff/tas_coat,
/obj/item/clothing/under/det/fluff/tasald,
/obj/item/fluff/permit/tasald_corlethian,
/obj/item/weapon/gun/projectile/revolver/detective/fluff/tasald_corlethian,
/obj/item/weapon/implanter/loyalty)
// jemli:Cirra Mayhem
/obj/item/weapon/storage/box/fluff/cirra
name = "Instant Pirate Kit"
desc = "Just add Akula!"
has_items = list(
/obj/item/clothing/head/pirate,
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/suit/pirate,
/obj/item/clothing/under/pirate)
// joey4298:Emoticon
/obj/item/weapon/storage/box/fluff/emoticon
name = "Emoticon's Mime Kit"
desc = "Specially packaged for the hungry catgirl mime with a taste for clown."
has_items = list(
/obj/item/device/fluff/id_kit_mime,
/obj/item/clothing/gloves/white,
/obj/item/clothing/head/beret,
/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing,
/obj/item/clothing/shoes/black,
/*/obj/item/toy/crayon/mime*/) //Need to track down the code for crayons before adding this back in
//joanrisu:Joan Risu
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/joanrisu
name = "Joan's Workbag"
desc = "A duffle bag Joan uses to carry her work equipment."
slowdown = 0
New()
..()
new /obj/item/clothing/accessory/holster/hip(src)
new /obj/item/clothing/suit/storage/fluff/fedcoat/fedcapt(src)
new /obj/item/weapon/card/id/centcom/fluff/joanbadge(src)
new /obj/item/weapon/gun/energy/gun/fluff/dominator(src)
new /obj/item/clothing/suit/armor/det_suit(src)
new /obj/item/fluff/permit/joanrisu(src)
new /obj/item/clothing/accessory/storage/black_vest(src)
new /obj/item/weapon/sword/fluff/joanaria(src)
new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src)
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
//joanrisu:Katarina Eine
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/Katarina
name = "Katarina's Workbag"
desc = "A duffle bag Katarina uses to carry her tools."
slowdown = 0
New()
..()
new /obj/item/clothing/accessory/holster/hip(src)
new /obj/item/clothing/suit/storage/fluff/fedcoat(src)
new /obj/item/weapon/gun/energy/gun/fluff/dominator(src)
new /obj/item/clothing/suit/armor/det_suit(src)
new /obj/item/clothing/accessory/storage/black_vest(src)
new /obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina(src)
new /obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina(src)
new /obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina(src)
new /obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina(src)
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
//Razerwing:Archer Maximus
/obj/item/weapon/storage/box/fluff/archermaximus
desc = "Personal Effects"
has_items = list(
/obj/item/fluff/permit/archermaximus,
/obj/item/weapon/gun/projectile/colt/fluff/archercolt)
// arokha:Aronai Kadigan
/obj/item/weapon/storage/backpack/dufflebag/emt/fluff/aro
name = "Aronai's Equipment"
desc = "A big dufflebag, containing the stuff Aronai likes to carry with him."
slowdown = 0 //HAX!
New()
..()
new /obj/item/clothing/head/helmet/space/fluff/aronai(src)
new /obj/item/clothing/suit/space/fluff/aronai(src)
new /obj/item/device/suit_cooling_unit(src)
new /obj/item/weapon/material/hatchet/tacknife/combatknife(src)
new /obj/item/weapon/card/id/centcom/fluff/aro(src)
new /obj/item/weapon/reagent_containers/hypospray/fluff/aronai(src)

View File

@@ -0,0 +1,684 @@
/* TUTORIAL
"icon" is the file with the HUD/ground icon for the item
"icon_state" is the iconstate in this file for the item
"icon_override" is the file with the on-mob icons, can be the same file
"item_state" is the iconstate for the on-mob icons:
item_state_s is used for worn uniforms on mobs
item_state_r and item_state_l are for being held in each hand
some do not have a suffix, like gloves. plan accordingly, maybe add _mob?
"overlay_state" is the iconstate for ties/accessories, for some reason they don't
just use the item_state variable
If you don't have a special HUD/ground sprite, don't worry about it.
Just set both the icon_state and item_state to the same thing,
and it will use the top direction sprite (facing the viewer)
for your HUD/item sprite. This usually looks fine!
Advanced:
"item_state_slots" can replace "item_state", it is a list:
item_state_slots["slotname1"] = "item state for that slot"
item_state_slots["slotname2"] = "item state for that slot"
*/
/* TEMPLATE
//ckey:Character Name
/obj/item/clothing/type/fluff/charactername
name = ""
desc = ""
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "myicon"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "myicon"
*/
//benemuel:Yuuko Shimmerpond
/obj/item/clothing/under/fluff/sakura_hokkaido_kimono
name = "Sakura Kimono"
desc = "A pale-pink, nearly white, kimono with a red and gold obi. There is a embroidered design of cherry blossom flowers covering the kimono."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "sh_kimono"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "sh_kimono_mob"
//BeyondMyLife:Kilano Soryu
/obj/item/clothing/under/dress/fluff/kilano
name = "Bleached Dress"
desc = "It appears that this was once a captain's dress, it's blueish color has been turned white by bleach, only the gold markings remain to slightly signify what it once was."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "kilanodress"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "kilanodress_mob"
species_restricted = null
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
//BeyondMyLife:Kilano Soryu
/obj/item/clothing/gloves/fluff/kilano
name = "Bleached Gloves"
desc = "Some old captain's gloves, bleached white, almost unrecognizable from the color change besides the gold trim."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "kilanogloves"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "kilanogloves_mob"
species_restricted = null
//JoanRisu:Joan Risu
/obj/item/clothing/under/suit_jacket/female/fluff/asuna
name = "Joan's Historia Uniform"
desc = "A red and white outfit used by Joan during her explorer days. Looks almost like a red school uniform."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "joanasuna"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "joanasuna"
//Unknown. Please check records from the forums.
/obj/item/clothing/under/suit_jacket/female/fluff/miqote
name = "Miqo'te Seperates"
desc = "This two-part set of clothing is very popular on the planet Hydaelyn. While made of very robust materials, its usefulness as armor is negated by the exposed midriff."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "miqote"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "miqote"
//JoanRisu:Joan Risu
/obj/item/clothing/under/fluff/nightgown
name = "nightgown"
desc = "A seethrough nightgown. For those intimate nights with your significant other."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "joannightgown"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "joannightgown"
//Vorrarkul:Lucina Dakarim
/obj/item/clothing/under/dress/fluff/lucinadress
name = "Elegant Purple Dress"
desc = "An expertly tailored dress, made out of fine fabrics. The interwoven necklace appears to be made out of gold, with three complicated symbols engraved in the front."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "solara_dress"
icon_override = 'icons/mob/uniform.dmi'
item_state = "solara_dress"
//For general use
/obj/item/clothing/suit/armor/hos/fluff/brittrenchcoat
name = "Britania Trench Coat"
desc = "An armored trench coat from the Brittanian Empire. It looks so British."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "brittrenchcoat"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "brittrenchcoat"
//For general use
/obj/item/clothing/suit/armor/hos/nazi_greatcoat
name = "Greatcoat"
desc = "Perfect attire for kicking down the doors of suspected dissidents; this coat gives off an imposing look, while offering a luxuriously plush fur liner."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "greatcoat"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "greatcoat_mob"
//For general use
/obj/item/clothing/suit/storage/fluff/fedcoat
name = "Federation Uniform Jacket"
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "fedcoat"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "fedcoat"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(
/obj/item/weapon/tank/emergency_oxygen,
/obj/item/device/flashlight,
/obj/item/weapon/gun/energy,
/obj/item/weapon/gun/projectile,
/obj/item/ammo_magazine,
/obj/item/ammo_casing,
// /obj/item/weapon/storage/fancy/shotgun_ammo,
/obj/item/weapon/melee/baton,
/obj/item/weapon/handcuffs,
// /obj/item/device/detective_scanner,
/obj/item/device/taperecorder)
armor = list(melee = 50, bullet = 15, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
var/unbuttoned = 0
verb/toggle()
set name = "Toggle coat buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(unbuttoned)
if(0)
icon_state = "[initial(icon_state)]_open"
item_state = "[initial(item_state)]_open"
unbuttoned = 1
usr << "You unbutton the coat."
if(1)
icon_state = "[initial(icon_state)]"
item_state = "[initial(item_state)]"
unbuttoned = 0
usr << "You button up the coat."
usr.update_inv_wear_suit()
//Variants
fedblue
name = "Federation Uniform Jacket"
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific."
icon_state = "fedblue"
item_state = "fedblue"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
fedeng
name = "Federation Uniform Jacket"
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is."
icon_state = "fedeng"
item_state = "fedeng"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 10, bomb = 0, bio = 30, rad = 35)
fedcapt
name = "Federation Uniform Jacket"
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet."
icon_state = "fedcapt"
item_state = "fedcapt"
armor = list(melee = 50, bullet = 5, laser = 15,energy = 10, bomb = 0, bio = 0, rad = 0)
/*POLARISTODO - Needs rework in update_icons as it doesn't use item_state
//For general use
/obj/item/clothing/glasses/welding/fluff/yellow
name = "Yellow Goggles"
desc = "A neat looking pair of goggles"
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "gogyellow"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "gogyellow"
/obj/item/clothing/glasses/welding/fluff/blue
name = "Blue Goggles"
desc = "A neat looking pair of goggles"
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "gogblue"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "gogblue"
*/
//wickedtemp:chakat tempest
/obj/item/clothing/glasses/hud/health/fluff/wickedtemphud
name = "Purple MedHUD"
desc = "A standard Medical HUD, only this one is colored purple with a violet lens."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "healthhud"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "healthhud"
//For general use
/obj/item/clothing/accessory/fluff/smilepin
name = "Smiley Pin"
desc = "A pin with a stupid grin on its face"
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "smilepin"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
overlay_state = "" //They don't have one
//For general use
/obj/item/clothing/accessory/fluff/heartpin
name = "Love Pin"
desc = "A cute heart pin."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "heartpin"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
overlay_state = "" //They don't have one
//john.wayne9392:Harmony Prechtl
/obj/item/clothing/suit/armor/captain/fluff/harmsuit
name = "Harmony's Captain Armor"
desc = "A modified Captain Armor suit for Harmony Prechtl."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "harmarmor"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "harmarmor"
//john.wayne9392:Harmony Prechtl
/obj/item/clothing/head/helmet/space/capspace/fluff/harmhelm
name = "Harmony's Captain Helmet"
desc = "A modified Captain helmet for Harmony Prechtl."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "harmspace"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "harmspace_mob"
//john.wayne9392:Harmony Prechtl
/obj/item/clothing/under/rank/captain/fluff/harmuniform
name = "Harmony's Captain uniform"
desc = "A customized Captain uniform for Harmony Prechtl, given to her as a gift by Central Command for her service."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "harmcaptain"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "harmcaptain"
//Variant
centcom
name = "\improper CentCom administrator's uniform"
desc = "It's a green jumpsuit with some gold markings denoting the rank of \"Administrator\"."
//john.wayne9392:Harmony Prechtl
/obj/item/clothing/head/centhat/fluff/harmhat
name = "Harmony's CentCom hat"
desc = "It's good to be queen."
// bwoincognito:Tasald Corlethian
/obj/item/clothing/under/det/fluff/tasald
name = "Tasald's outfit"
desc = "Tasald's outfit. Very green."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "tasaldsuit"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "tasaldsuit"
// bwoincognito:Tasald Corlethian
/obj/item/clothing/suit/storage/det_suit/fluff/tasald
name = "Tasald's Vest"
desc = "A fancy looking vest. You look like a smooth operating officer in this."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "tasvest"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "tasvest"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
// bwoincognito:Tasald Corlethian
/obj/item/clothing/suit/storage/det_suit/fluff/tas_coat
name = "Armored Colony coat"
desc = "Dark green and grey colored sleeveless long coat with two thick metal shoulder pads. has seen some wear and tear, with noticeable patches in the fabric, scratches on the shoulder pads, but with a clean patch on the left upper chest. It has a red NT marked on the right shoulder pad and red Security on the left. "
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "tasaldcoat"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "tasaldcoat_mob"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
//Event Costumes Below
/obj/item/clothing/head/helmet/fluff/freddy
name = "Animatronic Suit Helmet"
desc = "Votre toast, je peux vous le rendre."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "freddyhead"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "freddyhead_mob"
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS
cold_protection = HEAD
siemens_coefficient = 0.9
//Bonnie Head
bonnie
desc = "Children's entertainer."
icon_state = "bonniehead"
item_state = "bonniehead_mob"
//Foxy Head
foxy
desc = "I guess he doesn't like being watched."
icon_state = "foxyhead"
item_state = "foxyhead_mob"
//Chica Head
chica
desc = "<b><font color=red>LET'S EAT!</font></b>"
icon_state = "chicahead"
item_state = "chicahead_mob"
//Anamatronic Suits
/obj/item/clothing/suit/fluff/freddy
name = "Animatronic Suit"
desc = "Votre toast, je peux vous le rendre."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "freddysuit"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "freddysuit_mob"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
siemens_coefficient = 0.9
//Bonnie Suit
bonnie
desc = "Children's entertainer."
icon_state = "bonniesuit"
item_state = "bonniesuit_mob"
//Foxy Suit
foxy
desc = "I guess he doesn't like being watched."
icon_state = "foxysuit"
item_state = "foxysuit_mob"
//Chica Suit
chica
desc = "<b><font color=red>LET'S EAT!</font></b>"
icon_state = "chicasuit"
item_state = "chicasuit_mob"
//End event costumes
//scree:Scree
/obj/item/clothing/head/helmet/space/void/engineering/fluff/screehelm
name = "Modified Tajara Helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding. This one doesn't look like it was made for humans. Its been modified to include headlights."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "scree-helm"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "scree-helm_mob"
light_overlay = "helmet_light_dual"
species_restricted = null
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
..()
if(H.ckey != "scree")
H << "<span class='warning'>Your face and whoever is meant for this helmet are too different.</span>"
return 0
else
return 1
//scree:Scree
/obj/item/clothing/suit/space/void/engineering/fluff/screespess
name = "Modified Winged Suit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding. This one doesn't look like it was made for humans. This one was made with a special personal shielding for someone's wings."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "scree-spess"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "scree-spess_mob"
species_restricted = null
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
..()
if(H.ckey != "scree")
H << "<span class='warning'>The gloves only have three fingers, not to mention the accomidation for extra limbs.</span>"
return 0
else
return 1
//scree:Scree
/obj/item/clothing/under/fluff/screesuit
name = "Scree's feathers"
desc = "A mop of fluffy blue feathers, the honkmother only knows what kind of bird they originally came from."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "screesuit"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "screesuit"
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
..()
if(H.ckey != "scree")
H << "<span class='warning'>Are you just going to tape them on or what? This isn't gonna work.</span>"
return 0
else
return 1
//HOS Hardsuit
/obj/item/clothing/suit/space/void/security/fluff/hos // ToDo: Rig version.
name = "\improper prototype voidsuit"
desc = "A customized security voidsuit made to match the Head of Security's obession with black. Has additional composite armor."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "rig-hos"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "rig-hos_mob"
//HOS Hardsuit Helmet
/obj/item/clothing/head/helmet/space/void/security/fluff/hos // ToDo: Rig version.
name = "\improper prototype voidsuit helmet"
desc = "A customized security voidsuit helmet customized to include the Head of Security's signature hat. Has additional composite armor."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "rig0-hos"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "rig0-hos_mob"
//adk09:Lethe
/obj/item/clothing/head/helmet/hos/fluff/lethe
name = "Lethe's Hat"
desc = " This is Lethe's Hat! A little tag attached inside reads: 'If found please return to Lethe! Or else!' It looks rather worn in. It also lacks armor."
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "hoscap"
icon_override = 'icons/mob/head.dmi'
item_state = "hoscap"
/obj/item/weapon/storage/belt/utility/fluff/vulpine
name = "vulpine belt"
desc = "A tool-belt in Atmos colours."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "vulpine_belt"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "vulpine_belt_mob"
storage_slots = 9
New()
..()
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src, 30, "red")
new /obj/item/stack/cable_coil(src, 30, "green")
// molenar:Giliana Gamish
/obj/item/clothing/suit/storage/toggle/labcoat/fluff/molenar
name = "Gili Custom Labcoat"
desc = " Custom made, lengthened labcoat with water resistant, durable material. And a custom set of holes inserted for Deathclaw anatomy. A tag inside has 'G.G.' monogram on it"
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "molenar"
icon_open = "molenar_open"
icon_closed = "molenar"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "molenar"
//scree:Scree
/obj/item/clothing/head/fluff/pompom
name = "Pom-Pom"
desc = "A fluffy little thingus on a thin stalk, ideal for impersonating moogles and anglerfish. Kupomnomnom."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "pom"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "pom_mob"
w_class = 2.0
on = 0
brightness_on = 5
light_overlay = null
attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]"
return
switch(on)
if(0)
on = 1
user << "You light up your pom-pom."
icon_state = "pom-on"
item_state = "pom-on_mob"
if(1)
on = 0
user << "You dim your pom-pom."
icon_state = "pom"
item_state = "pom_mob"
update_light(user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.head == src)
H.update_inv_head()
// arokha : Aronai Kadigan
/obj/item/clothing/head/helmet/space/fluff/aronai
name = "Aronai's Helmet"
desc = "This spacesuit helmet appears to be custom-made for someone with pointed ears and a muzzle. \
It is form-fitting enough that it's unlikely to fit anyone but the person it was intended for. \
'Aronai' is printed on the back of the helmet."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "arohelm"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "arohelm_mob"
light_overlay = "helmet_light_dual"
camera_networks = list(NETWORK_MEDICAL)
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
..()
if(H.ckey != "arokha")
H << "<span class='warning'>You try to wear the helmet, but it doesn't fit.</span>"
return 0
else
return 1
/obj/item/clothing/suit/space/fluff/aronai
name = "Aronai's Spacesuit"
desc = "This spacesuit appears to be custom-made for someone with digitigrade legs and a tail. \
It is form-fitting enough that it's unlikely to fit anyone but the person it was intended for. \
'Aronai' is printed just above the spine on the back of the neckpiece. It has no space for an O2 tank. \
In fact, it's practically paper-thin. It doesn't seem to retain body heat at all."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "arosuit"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "arosuit_mob"
w_class = 4 //Oh but I can.
allowed = list(/obj/item/device/suit_cooling_unit) //Can't fit O2 tanks
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
..()
if(H.ckey != "arokha")
H << "<span class='warning'>You try to fit into the suit, to no avail.</span>"
return 0
else
return 1
//Viveret:Keturah
/obj/item/clothing/under/dress/maid/
name = "Maid Outfit"
desc = "A french maid outfit made ironically in Gaia's version of the far east."
//JoanRisu:Joan Risu
/obj/item/clothing/head/helmet/space/fluff/joan
name = "Joan's Combat Space Helmet"
desc = "A customized combat space helmet made for a certain squirrely Commissioned Officer. \
The top has the signature ears that are held up with a harder back covering. 'Joan' is engraved on the back.\
There are some indications that the helmet has seen combat."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "joanhelm"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "joanhelm_mob"
light_overlay = "helmet_light"
//JoanRisu:Joan Risu
/obj/item/clothing/suit/space/fluff/joan
name = "Joan's Combat Spacesuit"
desc = "A customized combat spacesuit made for a certain squirrely Commissioned Officer, tail slot included. \
On the right shoulder, the United Federation's Emblem sits proudly. On the left, there are faded indications \
that there were different ranks painted on and off. On the collar where the suit is softer is a rectangular \
name-tag with the name 'Joan' on it. There are indications that the suit has seen combat."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "joansuit"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "joansuit_mob"
/obj/item/clothing/under/rank/internalaffairs/fluff/joan
desc = "The plain, professional attire of a Federation Law Enforcement Detective. The collar is <i>immaculately</i> starched."
name = "Federation Dress Shirt"
icon_state = "internalaffairs"
item_state = "ba_suit"
worn_state = "internalaffairs"
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/black)

View File

@@ -0,0 +1,472 @@
/* TUTORIAL
"icon" is the file with the HUD/ground icon for the item
"icon_state" is the iconstate in this file for the item
"icon_override" is the file with the on-mob icons, can be the same file
"item_state" is the iconstate for the on-mob icons:
item_state_s is used for worn uniforms on mobs
item_state_r and item_state_l are for being held in each hand
"item_state_slots" can replace "item_state", it is a list:
item_state_slots["slotname1"] = "item state for that slot"
item_state_slots["slotname2"] = "item state for that slot"
on guns, in particular:
item_state being null makes it look for exactly the icon_state in the on-mob file,
including any 0,75,etc appended from the energy bar setting
item_state being present prevents different mode sprites, sadly, but you may
be able to override this on the gun itself with a proc
*/
/* TEMPLATE
//ckey:Character Name
/obj/item/weapon/gun/type/fluff/charactername
name = ""
desc = ""
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "myicon"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "myicon"
*/
//////////////////// Projectile Weapons ////////////////////
// For general use
/obj/item/weapon/gun/projectile/automatic/battlerifle
name = "\improper BR55 Service Rifle"
desc = "You had your chance to be afraid before you joined my beloved Corps! But, to guide you back to the true path, I brought this motivational device! Uses unique 9.5x40mm rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "battlerifle"
icon_override = 'icons/obj/gun_vr.dmi'
item_state = "battlerifle"
item_icons = null
w_class = 4
recoil = 2 // The battlerifle was known for its nasty recoil.
max_shells = 36
caliber = "9.5x40mm"
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
ammo_type = /obj/item/ammo_casing/a95mm
magazine_type = /obj/item/ammo_magazine/battlerifle
allowed_magazines = list(/obj/item/ammo_magazine/battlerifle)
fire_sound = 'sound/weapons/battlerifle.ogg'
load_method = MAGAZINE
slot_flags = SLOT_BACK
//requires_two_hands = 1
one_handed_penalty = 4 // The weapon itself is heavy
// For general use
/obj/item/weapon/gun/projectile/shotgun/pump/unsc
name = "\improper M45E Tactical Shotgun"
desc = "All you greenhorns who wanted to see Xenomorphs up close... this is your lucky day."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "haloshotgun"
icon_override = 'icons/obj/gun_vr.dmi'
item_state = "haloshotgun"
item_icons = null
ammo_type = /obj/item/ammo_casing/shotgun
max_shells = 12
// jertheace : Jeremiah 'Ace' Acacius
/obj/item/weapon/gun/projectile/shotgun/pump/unsc/fluff/ace
name = "Ace's M45D Tactical Shotgun" // D-model holds half as many shells as the normal version so as not to be OP as shit. Better than shotgun, worse than combat shotgun.
desc = "Owned by the respected (or feared?) veteran Captain of VORE Station. Inscribed on the barrel are the words \"Speak softly, and carry a big stick.\" It has a folding stock so it can fit into bags."
w_class = 3 // Because collapsable stock so it fits in backpacks.
ammo_type = /obj/item/ammo_casing/shotgun/stunshell
max_shells = 6
// bwoincognito:Tasald Corlethian
/obj/item/weapon/gun/projectile/revolver/detective/fluff/tasald_corlethian
name = "Big Iron revolver"
desc = "A .38 revolver for veteran rangers on the planet Orta. The right side of the handle has a logo for Quarion industries, and the left is the Rangers. The primary ammo for this gun is .38 rubber. According to the CentCom Chief of Security, this revolver was more controversial than it needed to be."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "tasaldrevolver"
item_state = "revolver"
fire_sound = 'sound/weapons/pistol.ogg'
ammo_type = /obj/item/ammo_casing/c38r
var/recentpump = 0
var/cocksound = 'sound/weapons/revolvercock.ogg'
consume_next_projectile()
if(chambered)
return chambered.BB
usr << "<span class='warning'>It's a single action revolver, pull the hammer back!</span>"
return null
attack_self(mob/living/user as mob)
if(world.time >= recentpump + 10)
pump(user)
recentpump = world.time
proc/pump(mob/M as mob)
playsound(M, cocksound, 60, 1)
if(chambered)//We have a shell in the chamber
chambered.loc = get_turf(src)//Eject casing
chambered = null
if(loaded.len)
var/obj/item/ammo_casing/AC = loaded[1] //load next casing.
loaded -= AC //Remove casing from loaded list.
chambered = AC
update_icon()
// wankersonofjerkin : Ryan Winz
/obj/item/weapon/gun/projectile/revolver/fluff/ryan_winz_revolver
name = "Ryan's 'Devilgun'"
desc = "You notice the serial number on the revolver is 666. The word 'Sin' is engraved on the blood-red rosewood grip. Uses .357 rounds."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "ryan_winz"
item_state = "revolver"
/obj/item/weapon/gun/projectile/revolver/fluff/ryan_winz_revolver/redemption
name = "Ryan's 'Redeemer'"
desc = "You notice the serial number on the revolver is 667. The word 'Redemption' is engraved on dark rosewood grip. Uses .357 rounds."
// sasoperative : Joseph Skinner
/obj/item/weapon/gun/projectile/revolver/shotgun/fluff/sasoperative
name = "\"The Jury\""
desc = "A customized variant of the \"The Judge\" revolver sold by Cybersun Industries, built specifically for Joseph Skinner. Uses 12g shells."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "jury"
item_state = "gun"
accuracy = 0 // Because I know you're not an idiot who needs to be nerfed. -Ace
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
// For general use
/obj/item/weapon/gun/projectile/automatic/stg
name = "\improper Sturmgewehr"
desc = "An STG-560 built by RauMauser. Experience the terror of the Siegfried line, redone for the 26th century! The Kaiser would be proud. Uses unique 7.92x33mm Kurz rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "stg60"
item_state = "arifle"
w_class = 4
max_shells = 30
caliber = "kurz"
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_ILLEGAL = 6)
magazine_type = /obj/item/ammo_magazine/stg
allowed_magazines = list(/obj/item/ammo_magazine/stg)
load_method = MAGAZINE
/obj/item/weapon/gun/projectile/automatic/stg/update_icon(var/ignore_inhands)
..()
icon_state = (ammo_magazine)? "stg60" : "stg60-empty"
item_state = (ammo_magazine)? "arifle" : "arifle-empty"
if(!ignore_inhands) update_held_icon()
// For general use
/obj/item/weapon/gun/projectile/automatic/m14/fluff/gallian
name = "\improper Gallian 4 Rifle"
desc = "The ever reliable Gallian 4 Rifle. Produced by the National Armory on the Planet of Gaia located in Gallia, the Gallian 4 Rifle offers high accuracy and is widely used in the United Federation's Military. Uses 7.62mm rounds."
// For general use
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/zmkar
name = "\improper ZM Kar 1"
desc = "A reproduction of an old ZM Kar 1 Rifle from the Autocratic East Europan Imperial Alliance of Gaia. Popular among imperials and collectors within the Federation and its allies. Uses 7.62mm rounds."
// For general use
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/wicked
name = "Wicked Butterfly ZM Kar S1"
desc = "A customized bolt-action sniper rifle that was carried by some of the most revered snipers in the Federation. The stock has a small butterfly engraved on it. Uses 7.62mm rounds."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "wickedbutterfly"
icon_override = 'icons/obj/gun_vr.dmi'
item_state = "SVD"
item_icons = null
recoil = 2 //extra kickback
accuracy = -1
scoped_accuracy = 2
load_method = SINGLE_CASING
verb/scope()
set category = "Object"
set name = "Use Scope"
set popup_menu = 1
toggle_scope(2.0)
// For general use
/obj/item/weapon/gun/projectile/automatic/pdw // Vorestation SMG because the WT550 is ugly and bad.
name = "personal defense weapon"
desc = "The X-9MM is a select-fire personal defense weapon designed in-house by Xing Private Security. It was made to compete with the WT550 Saber, but hasn't yet caught on in popularity outside of the Virgo-Erigone system. Uses 9mm rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "pdw"
item_state = "c20r" // Placeholder
w_class = 3
caliber = "9mm"
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
slot_flags = SLOT_BELT
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/mc9mml
allowed_magazines = list(/obj/item/ammo_magazine/mc9mm, /obj/item/ammo_magazine/mc9mml)
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-1,-2), dispersion=list(0.0, 0.6, 0.6))
)
/obj/item/weapon/gun/projectile/automatic/pdw/update_icon(var/ignore_inhands)
..()
if(istype(ammo_magazine,/obj/item/ammo_magazine/mc9mm))
icon_state = "pdw-short"
else
icon_state = (ammo_magazine)? "pdw" : "pdw-empty"
if(!ignore_inhands) update_held_icon()
//Currently, the only problem I have now is that this weapon's item_state isn't working.
/obj/item/weapon/gun/projectile/automatic/fluff/crestrose
name = "Crescent Rose"
desc = "Can you match my resolve? If so then you will succeed. I believe that the human spirit is indomitable. Keep Moving Forward. Uses 5.56mm rounds."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "crestrose_fold"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "crestrose_fold_mob"
w_class = 4
origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 4)
slot_flags = null
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
force = 3
recoil = 2
var/on = 0
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
hitsound = null
caliber = "a556"
magazine_type = /obj/item/ammo_magazine/a556
allowed_magazines = list(/obj/item/ammo_magazine/a556)
/obj/item/weapon/gun/projectile/automatic/fluff/crestrose/attack_self(mob/user as mob)
on = !on
if(on)
user.visible_message("<span class='warning'>With a press of a button, [user]'s gun turns into a deadly scythe.</span>",\
"<span class='warning'>You extend The Rose's thorns.</span>",\
"You hear an ominous click.")
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "crestrose"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "crestrose_mob"
w_class = 4
force = 15//Obscenely robust
attack_verb = list("slashed", "cut", "drives")
hitsound = 'sound/weapons/bladeslice.ogg'
else
user.visible_message("<span class='notice'>\The [user] folds the weapon back up into a gun.</span>",\
"<span class='notice'>You fold up the weapon.</span>",\
"You hear a click.")
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "crestrose_fold"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "crestrose_fold_mob"
w_class = 3
force = 3//Not so obscenely robust
attack_verb = list("hit", "melee'd")
hitsound = null
update_icon()
/obj/item/weapon/gun/projectile/automatic/fluff/crestrose/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(50))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
return 1
return 0
// molenar:Kari Akiren
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/fluff/kari_akiren
name = "clockwork rifle"
desc = "Brass, copper, and lots of gears. Well lubricated for fluid movement as each round is loaded, locked, and fired. Just like clockwork."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "clockworkrifle"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "clockworkrifle"
item_icons = null
//Razerwing:Archer Maximus
/obj/item/weapon/gun/projectile/colt/fluff/archercolt
name = "\improper MEUSOC .45"
desc = "Some serious drywall work, coming up!"
//////////////////// Energy Weapons ////////////////////
//arokha:Aronai Kadigan
/obj/item/weapon/gun/energy/gun/fluff/aro
name = "\improper KIN-H21"
desc = "The Kitsuhana Heavy Industries standard Imperial Navy energy sidearm, commonly called the KIN21. This one appears to have been modified to have additional features at the cost of battery life."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "kinh21stun100"
item_state = "laser"
modifystate = "kinh21stun"
projectile_type = /obj/item/projectile/beam/stun/kin21
max_shots = 8
charge_cost = 125
charge_meter = 1
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/kin21, modifystate="kinh21stun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="kinh21kill", fire_sound='sound/weapons/blaster_pistol.ogg'),
list(mode_name="shrink", projectile_type=/obj/item/projectile/beam/shrinklaser, modifystate="kinh21shrink", fire_sound='sound/weapons/wave.ogg'),
list(mode_name="grow", projectile_type=/obj/item/projectile/beam/growlaser, modifystate="kinh21grow", fire_sound='sound/weapons/pulse3.ogg'),
)
// -------------- Dominator -------------
/obj/item/weapon/gun/energy/gun/fluff/dominator
name = "\improper MWPSB Dominator"
desc = "A MWPSB's Dominator from the Federation. Like the basic Energy Gun, this gun has two settings. It is used by the United Federation Public Safety Bureau's Criminal Investigation Division."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "dominatorstun100"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = null
item_icons = null
fire_sound = 'sound/weapons/Taser.ogg'
projectile_type = /obj/item/projectile/beam/stun
modifystate = "dominatorstun"
firemodes = list(
list(mode_name="stun", charge_cost=100,projectile_type=/obj/item/projectile/beam/stun, modifystate="dominatorstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", charge_cost=125,projectile_type=/obj/item/projectile/beam/dominator, modifystate="dominatorkill", fire_sound='sound/weapons/gauss_shoot.ogg'),
)
// ------------ Energy Luger ------------
/obj/item/weapon/gun/energy/gun/eluger
name = "energy Luger"
desc = "The finest sidearm produced by RauMauser, this pistol can punch a hole through inch thick steel plating. This ain't your great-grand-daddy's Luger! Can switch between stun and kill."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "elugerstun100"
item_state = "gun"
charge_cost = 100 //How much energy is needed to fire.
projectile_type = /obj/item/projectile/beam/stun
modifystate = "elugerstun"
fire_sound = 'sound/weapons/Taser.ogg'
firemodes = list(
list(mode_name="stun", charge_cost=100,projectile_type=/obj/item/projectile/beam/stun, modifystate="elugerstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", charge_cost=200,projectile_type=/obj/item/projectile/beam/eluger, modifystate="elugerkill", fire_sound='sound/weapons/eluger.ogg'),
)
//////////////////// Custom Ammo ////////////////////
//---------------- Beams ----------------
/obj/item/projectile/beam/eluger
name = "laser beam"
icon_state = "emitter"
/obj/item/projectile/beam/dominator
name = "dominator lethal beam"
icon_state = "xray"
muzzle_type = /obj/effect/projectile/xray/muzzle
tracer_type = /obj/effect/projectile/xray/tracer
impact_type = /obj/effect/projectile/xray/impact
/obj/item/projectile/beam/stun/kin21
name = "kinh21 stun beam"
icon_state = "omnilaser"
muzzle_type = /obj/effect/projectile/laser_omni/muzzle
tracer_type = /obj/effect/projectile/laser_omni/tracer
impact_type = /obj/effect/projectile/laser_omni/impact
//--------------- StG-60 ----------------
/obj/item/ammo_magazine/stg
name = "box mag (7.92x33mm Kurz)"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "stg_30rnd"
caliber = "kurz"
ammo_type = /obj/item/ammo_casing/stg
max_ammo = 30
mag_type = MAGAZINE
/obj/item/ammo_casing/stg
desc = "A 7.92<EFBFBD>33mm Kurz casing."
icon_state = "rifle-casing"
caliber = "kurz"
projectile_type = /obj/item/projectile/bullet/rifle/a762
/obj/item/ammo_magazine/stg/empty
initial_ammo = 0
//------------- Battlerifle -------------
/obj/item/ammo_magazine/battlerifle
name = "box mag (9.5x40mm)"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "battlerifle"
caliber = "9.5x40mm"
ammo_type = /obj/item/ammo_casing/a95mm
max_ammo = 36
mag_type = MAGAZINE
multiple_sprites = 1
/obj/item/ammo_casing/a95mm
desc = "A 9.5x40mm bullet casing."
icon_state = "rifle-casing"
caliber = "9.5x40mm"
projectile_type = /obj/item/projectile/bullet/rifle/a95mm
/obj/item/projectile/bullet/rifle/a95mm
damage = 40
penetrating = 2 // Better penetration than the 7.62mm
/obj/item/ammo_magazine/battlerifle/empty
initial_ammo = 0
//---------------- PDW ------------------
/obj/item/ammo_magazine/mc9mml
name = "\improper SMG magazine (9mm)"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "smg"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(DEFAULT_WALL_MATERIAL = 1800)
caliber = "9mm"
ammo_type = /obj/item/ammo_casing/c9mm
max_ammo = 30
multiple_sprites = 1
/obj/item/ammo_magazine/mc9mml/empty
initial_ammo = 0
/obj/item/ammo_magazine/mc9mml/ap
name = "\improper SMG magazine (9mm armor-piercing)"
ammo_type = /obj/item/ammo_casing/c9mm/ap
/obj/item/ammo_magazine/mc9mml/flash
name = "\improper SMG magazine (9mm flash)"
ammo_type = /obj/item/ammo_casing/c9mmf
/obj/item/ammo_magazine/mc9mml/rubber
name = "\improper SMG magazine (9mm rubber)"
ammo_type = /obj/item/ammo_casing/c9mmr
/obj/item/ammo_magazine/mc9mml/practice
name = "\improper SMG magazine (9mm practice)"
ammo_type = /obj/item/ammo_casing/c9mmp

View File

@@ -0,0 +1,345 @@
/* TUTORIAL
"icon" is the file with the HUD/ground icon for the item
"icon_state" is the iconstate in this file for the item
"icon_override" is the file with the on-mob icons, can be the same file
"item_state" is the iconstate for the on-mob icons:
item_state_s is used for worn uniforms on mobs
item_state_r and item_state_l are for being held in each hand
"item_state_slots" can replace "item_state", it is a list:
item_state_slots["slotname1"] = "item state for that slot"
item_state_slots["slotname2"] = "item state for that slot"
*/
/* TEMPLATE
//ckey:Character Name
/obj/item/weapon/fluff/charactername
name = ""
desc = ""
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "myicon"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "myicon"
*/
//For general use
/obj/item/device/modkit_conversion
name = "modification kit"
desc = "A kit containing all the needed tools and parts to modify a suit and helmet."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "modkit"
var/parts = 3
var/from_helmet = /obj/item/clothing/head/helmet/space/void
var/from_suit = /obj/item/clothing/suit/space/void
var/to_helmet = /obj/item/clothing/head/cardborg
var/to_suit = /obj/item/clothing/suit/cardborg
//Conversion proc
afterattack(obj/O, mob/user as mob)
var/flag
var/to_type
if(istype(O,from_helmet))
flag = 1
to_type = to_helmet
else if(istype(O,from_suit))
flag = 2
to_type = to_suit
else
return
if(!(parts & flag))
user << "<span class='warning'>This kit has no parts for this modification left.</span>"
return
if(istype(O,to_type))
user << "<span class='notice'>[O] is already modified.</span>"
return
if(!isturf(O.loc))
user << "<span class='warning'>[O] must be safely placed on the ground for modification.</span>"
return
playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1)
var/N = new to_type(O.loc)
user.visible_message("<span class='warning'>[user] opens \the [src] and modifies \the [O] into \the [N].</span>","<span class='warning'>You open \the [src] and modify \the [O] into \the [N].</span>")
qdel(O)
parts &= ~flag
if(!parts)
qdel(src)
//JoanRisu:Joan Risu
/obj/item/weapon/flame/lighter/zippo/fluff/joan
name = "Federation Zippo Lighter"
desc = "A red zippo lighter with the United Federation Logo on it."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "joanzip"
//JoanRisu:Joan Risu
/obj/item/weapon/sword/fluff/joanaria
name = "Aria"
desc = "A beautifully crafted rapier owned by Joan Risu. It has a thin blade and is used for quick attacks."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "joanaria"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "joanariamob"
origin_tech = "materials=7"
force = 15
sharp = 1
edge = 1
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/sword/fluff/joanaria/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(75))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
return 1
return 0
//joanrisu:Katarina Eine
/obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina
name = "tactical Knife"
desc = "A tactical knife with a small butterly engraved on the blade."
obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(75))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
return 1
return 0
//For General use
/obj/item/weapon/sword/fluff/joanaria/scisword
name = "Scissor Blade"
desc = "A sword that can not only cut down your enemies, it can also cut fabric really neatly"
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "scisword"
origin_tech = "materials=7"
//john.wayne9392:Harmony Prechtl
/obj/item/weapon/twohanded/fireaxe/fluff/mjollnir
name = "Mjollnir"
desc = "Large hammer that looks like it can do a great deal of damage if properly used."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "harmonymjollnir"
origin_tech = "materials=7"
attack_verb = list("attacked", "hammered", "smashed", "slammed", "crushed")
//JoanRisu:Joan Risu
/obj/item/weapon/card/id/centcom/fluff/joanbadge
name = "Faded Badge"
desc = "A faded badge, backed with leather, that reads 'NT Security Force' across the front."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "joanbadge"
registered_name = "Joan Risu"
assignment = "Centcom Officer"
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("<span class='warning'>[user] flashes their golden security badge.\nIt reads:NT Security.</span>","<span class='warning'>You display the faded badge.\nIt reads: NT Security.</span>")
attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("<span class='warning'>[user] invades [M]'s personal space, thrusting [src] into their face insistently.</span>","<span class='warning'>You invade [M]'s personal space, thrusting [src] into their face insistently.</span>")
//JoanRisu:Joan Risu
/obj/item/device/pda/heads/hos/fluff/joanpda
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "pda-joan"
//Vorrarkul:Lucina Dakarim
/obj/item/device/pda/heads/hos/fluff/lucinapda
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "pda-lucina"
//john.wayne9392:Harmony Prechtl
/obj/item/device/modkit_conversion/fluff/harmonyspace
name = "Harmony's captain space suit modkit"
desc = "A kit containing all the needed tools and parts to modify a Captain's hardsuit. It has green and yellow parts inside."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "harmony_kit"
from_helmet = /obj/item/clothing/head/helmet/space/capspace
from_suit = /obj/item/clothing/suit/armor/captain
to_helmet = /obj/item/clothing/head/helmet/space/capspace/fluff/harmhelm
to_suit = /obj/item/clothing/suit/armor/captain/fluff/harmsuit
//john.wayne9392:Harmony Prechtl
/obj/item/device/modkit_conversion/fluff/harmonysuit
name = "Harmony's captain suit modkit"
desc = "A sewing kit containing all the needed tools and fabric to modify a Captain's suit and hat. It has green and yellow fabrics inside."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "harmony_kit"
from_helmet = /obj/item/clothing/head/caphat
from_suit = /obj/item/clothing/under/rank/captain
to_helmet = /obj/item/clothing/head/centhat/fluff/harmhat
to_suit = /obj/item/clothing/under/rank/captain/fluff/harmuniform
//scree:Scree
/obj/item/device/modkit_conversion/fluff/screekit
name = "Scree's hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for a specific user. This one looks like it's fitted for a winged creature."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "modkit"
from_helmet = /obj/item/clothing/head/helmet/space/void/engineering
from_suit = /obj/item/clothing/suit/space/void/engineering
to_helmet = /obj/item/clothing/head/helmet/space/void/engineering/fluff/screehelm
to_suit = /obj/item/clothing/suit/space/void/engineering/fluff/screespess
//General Use
/obj/item/weapon/flag
name = "Nanotrasen Banner"
desc = "I pledge allegiance to the flag of a megacorporation in space."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "Flag_Nanotrasen"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "Flag_Nanotrasen_mob"
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("<span class='warning'>[user] waves their Banner around!</span>","<span class='warning'>You wave your Banner around.</span>")
attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("<span class='warning'>[user] invades [M]'s personal space, thrusting [src] into their face insistently.</span>","<span class='warning'>You invade [M]'s personal space, thrusting [src] into their face insistently.</span>")
federation
name = "Federation Banner"
desc = "Space, The Final Frontier. Sorta. Just go with it and say the damn oath."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "flag_federation"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "flag_federation_mob"
xcom
name = "Alien Combat Command Banner"
desc = "A banner bearing the symbol of a task force fighting an unknown alien power."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "flag_xcom"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "flag_xcom_mob"
advent
name = "ALIEN Coalition Banner"
desc = "A banner belonging to traitors who work for an unknown alien power."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "flag_advent"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "flag_advent_mob"
//zodiacshadow: ?
/obj/item/device/radio/headset/fluff/zodiacshadow
name = "Nehi's 'phones"
desc = "A pair of old-fashioned purple headphones for listening to music that also double as an NT-approved headset; they connect nicely to any standard PDA. One side is engraved with the letters NEHI, the other having an elaborate inscription of the words \"My voice is my weapon of choice\" in a fancy font. A modern polymer allows switching between modes to either allow one to hear one's surroundings or to completely block them out."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "headphones"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "headphones_mob"
// OrbisA: Richard D'angelo
/obj/item/weapon/melee/fluff/holochain
name = "Holographic Chain"
desc = "A High Tech solution to simple perversions. It has a red leather handle and the initials R.D. on the silver base."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "holochain"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "holochain_mob"
flags = CONDUCT | NOBLOODY
no_attack_log = 1 //if you want to turn on the attack log for this, comment/delete this line. Orbis.
slot_flags = SLOT_BELT
force = 10
throwforce = 3
w_class = 3
damtype = HALLOSS
attack_verb = list("flogged", "whipped", "lashed", "disciplined", "chastised", "flayed")
// joey4298:Emoticon
/obj/item/device/fluff/id_kit_mime
name = "Mime ID reprinter"
desc = "Stick your ID in one end and it'll print a new ID out the other!"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
afterattack(obj/O, mob/user as mob)
var/new_icon = "mime"
if(istype(O,/obj/item/weapon/card/id) && O.icon_state != new_icon)
//O.icon = src.icon // just in case we're using custom sprite paths with fluff items.
O.icon_state = new_icon // Changes the icon without changing the access.
playsound(user.loc, 'sound/items/polaroid2.ogg', 100, 1)
user.visible_message("<span class='warning'> [user] reprints their ID.</span>")
del(src)
else if(O.icon_state == new_icon)
user << "<span class='notice'>[O] already has been reprinted.</span>"
return
else
user << "<span class='warning'>This isn't even an ID card you idiot.</span>"
return
//arokha:Aronai Kadigan
/obj/item/weapon/card/id/centcom/fluff/aro
registered_name = "CONFIGURE ME"
assignment = "CC Medical"
var/configured = 0
attack_self(mob/user as mob)
if(configured == 1) return ..()
user.set_id_info(src)
configured = 1
user << "<span class='notice'>Card settings set.</span>"
//arokha:Aronai Kadigan
/obj/item/weapon/reagent_containers/hypospray/fluff/aronai
name = "worn hypospray"
desc = "This hypospray seems a bit well-used. The blue band indicates it's from the CentCom medical division. There's an 'A' scratched into the bottom."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "aro_hypo"
New()
..()
reagents.add_reagent("inaprovaline", 5)
reagents.add_reagent("tricordrazine", 25)
//Swat43:Fortune Bloise
/obj/item/weapon/storage/backpack/satchel/fluff/swat43bag
name = "Coloured Satchel"
desc = "That's a coloured satchel with red stripes, with a heart and ripley logo on each side."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "swat43-bag"
icon_override = 'icons/vore/custom_items_vr.dmi'
item_state = "swat43-bag_mob"
//Dhaeleena:Dhaeleena M'iar
/obj/item/clothing/accessory/medal/silver/security/fluff/dhael
desc = "An award for distinguished combat and sacrifice in defence of corporate commercial interests. Often awarded to security staff. It's engraved with the letters S.W.A.T."
//Vorrarkul:Lucina Dakarim
/obj/item/clothing/accessory/medal/gold/fluff/lucina
name = "Medal of Medical Excellence"
desc = "A medal awarded to Lucina Darkarim for excellence in medical service."

View File

@@ -0,0 +1,130 @@
// BEGIN - DO NOT EDIT PROTOTYPE
/obj/item/fluff/permit
name = "Sample Permit"
desc = {"There is a bright red <b><font color=red>SAMPLE PERMIT</font></b> stamped across the stock photo displayed on the card. Obviously this is only an example to educate security.
<b>NAME:</b> First Last | <b>RACE:</b> Human | <b>HOMEWORLD:</b> Moon (if applicable), Planet, System
<b>DOB:</b> DD/Mon/YYYY | <b>HEIGHT:</b> XXcm | <b>SEX:</b> Female
The individual named above is licensed by the Nanotrasen Department of Civil Protection to ___________________.
This license expires on DD/Month/YYYY and must be renewed by CentCom prior to this date."}
icon = 'icons/obj/card.dmi'
icon_state = "guest"
w_class = 1
// END - DO NOT EDIT PROTOTYPE
/* TEMPLATE
/obj/item/fluff/permit/charactername
name = "Name's Thing Permit"
desc = {"
<b>NAME:</b> Firstname Lastname | <b>RACE:</b> Human | <b>HOMEWORLD:</b> Earth, Sol
<b>DOB:</b> DD/Mon/YYYY | <b>HEIGHT:</b> XXXcm | <b>SEX:</b> X
The individual named above is licensed by the Nanotrasen Department of Civil Protection to openly carry XYZ. CONDITIONS.
This license expires on DD/Mon/YYYY and must be renewed by CentCom prior to this date."}
*/
// bwoincognito:Tasald Corlethian
/obj/item/fluff/permit/tasald_corlethian
name = "Tasald Ajax Corlethian's Sidearm Permit"
desc = {"
<b>NAME:</b> Tasald Ajax Corlethian | <b>RACE:</b> Vulpine | <b>HOMEWORLD:</b> Iscyn, Orta
<b>DOB:</b> 09/Sep/2529 | <b>HEIGHT:</b> 187cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one .38 pistol.
This license expires on 30/March/2561 and must be renewed by CentCom prior to this date."}
/*
// jertheace:Jeremiah 'Ace' Acacius
/obj/item/fluff/permit/jerace
name = "Ace's Shotgun Permit"
desc = {"
<b>NAME:</b> Jeremiah Acacius | <b>RACE:</b> Human | <b>HOMEWORLD:</b> Earth, Sol
<b>DOB:</b> 17/Jun/2532 | <b>HEIGHT:</b> 178cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to openly carry one M45D shotgun loaded with less-than-lethal munitions as a head of staff. Else this weapon is to be turned in to security for holding until the end of the shift.
This license expires on 01/Jun/2560 and must be renewed by CentCom prior to this date."}
*/
/*
// sasoperative:Joseph Skinner
/obj/item/fluff/permit/josephskinner
name = "Joseph Skinner's 12g Revolver Permit"
desc = {"
<b>NAME:</b> Joseph Cyrus Skinner | <b>RACE:</b> Human | <b>HOMEWORLD:</b> Earth, Sol
<b>DOB:</b> 10/Jun/2532 | <b>HEIGHT:</b> 162.5cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one 12 gauge revolver loaded with less-than-lethal munitions as a member of security or head of staff. Else this weapon is to be turned in to security for holding until the end of the shift.
This license expires on 29/Nov/2559 and must be renewed by CentCom prior to this date."}
*/
/*
// wankersonofjerkin:Ryan Winz
/obj/item/fluff/permit/ryanwinz
name = "Ryan Winz's Revolver Permit"
desc = {"
<b>NAME:</b> Ryan Winz | <b>RACE:</b> Human | <b>HOMEWORLD:</b> New Ekaterina, Moskva
<b>DOB:</b> 27/Oct/2536 | <b>HEIGHT:</b> 172cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to openly carry one Colt Single-Action Army revolver as a security officer or head of staff. Else this weapon is to be turned in to security for holding until the end of the shift.
This license expires on 26/Dec/2559 and must be renewed by CentCom prior to this date."}
*/
// bwoincognito:Tasald Corlethian
/obj/item/fluff/permit/tasald_corlethian
name = "Tasald Ajax Corlethian's Sidearm Permit"
desc = {"
<b>NAME:</b> Tasald Ajax Corlethian | <b>RACE:</b> Vulpine | <b>HOMEWORLD:</b> Iscyn, Orta
<b>DOB:</b> 09/Sep/2529 | <b>HEIGHT:</b> 187cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one .38 pistol.
This license expires on 30/March/2561 and must be renewed by CentCom prior to this date."}
// arokha:Aronai Kadigan
/obj/item/fluff/permit/aronai_kadigan
name = "Aronai Kadigan's Sidearm Permit"
desc = {"
<b>NAME:</b> Aronai Kadigan | <b>RACE:</b> Cross Fox | <b>HOMEWORLD:</b> New Kitsuhana, KHI1
<b>DOB:</b> 12/Jul/2530 | <b>HEIGHT:</b> 188cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one KIN-H21 (Egun Variant).
This license expires on 30/Sep/2560 and must be renewed by CentCom prior to this date."}
// joanrisu:Joan Risu
/obj/item/fluff/permit/joanrisu
name = "Joan Risu's Sidearm Permit"
desc = {"
<b>NAME:</b> Joan Risu | <b>RACE:</b> Squirrelkin | <b>HOMEWORLD:</b> Luna, Gaia, Koi
<b>DOB:</b> 16/Apr/2536 | <b>HEIGHT:</b> 161cm | <b>SEX:</b> Female
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one MWPSB Dominator.
This license expires on 11/Dec/2560 and must be renewed by CentCom prior to this date."}
// molenar:Kari Akiren
/obj/item/fluff/permit/kari_akiren
name = "Kari Akiren's Rifle Permit"
desc = {"
<b>NAME:</b> Kari Akiren | <b>RACE:</b> Inkling | <b>HOMEWORLD:</b> Supesu
<b>DOB:</b> 26-Jun-2553 | <b>HEIGHT:</b> 163cm | <b>SEX:</b> Female
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one Clockwork Rifle (bolt-action variant).
This license expires on 14/Dec/2560 and must be renewed by CentCom prior to this date."}
//eekasqueak: Serkii Miishy
/obj/item/fluff/permit/serkiimiishy
name = "Serkii Miishy's Stun Revolver Permit"
desc = {"
<b>NAME:</b> Serkii Miishy | <b>RACE:</b> Mousemorph | <b>HOMEWORLD:</b> Mars, Sol
<b>DOB:</b> 10/9/2441 | <b>HEIGHT:</b> 122cm | <b>SEX:</b> Male
The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one stun revolver.
This license expires on 30/March/2561 and must be renewed by CentCom prior to this date."}
//Razerwing:Archer Maximus
/obj/item/fluff/permit/archermaximus
name = "Archer Maximus's MEUSOC 45 Permit"
desc = {"
<b>NAME:</b> FArcher Maximus | <b>RACE:</b> Human | <b>HOMEWORLD:</b> Charybdis
<b>DOB:</b> 04/18/2521 | <b>HEIGHT:</b> 172.7cm | <b>SEX:</b> female
The individual named above is licensed by the Nanotrasen Department of Civil Protection to openly carry a MEUSOC 45. CONDITIONS.
This license expires on 31/May/2561 and must be renewed by CentCom prior to this date."}

View File

@@ -0,0 +1,37 @@
//The base hooks themselves
//New() hooks
/hook/client_new
/hook/mob_new
/hook/living_new
/hook/carbon_new
/hook/human_new
/hook/simple_animal_new
//Hooks for interactions
/hook/living_attackby
//
//Hook helpers to expand hooks to others
//
/hook/mob_new/proc/chain_hooks(mob/M)
var/result = 1
if(isliving(M))
if(!hook_vr("living_new",args))
result = 0
if(iscarbon(M))
if(!hook_vr("carbon_new",args))
result = 0
if(ishuman(M))
if(!hook_vr("human_new",args))
result = 0
//Return 1 to superhook
return result

View File

@@ -0,0 +1,63 @@
//
// Gravity Pull effect which draws in movable objects to its center.
// In this case, "number" refers to the range. directions is ignored.
//
/datum/effect/effect/system/grav_pull
var/pull_radius = 3
var/pull_anchored = 0
var/break_windows = 0
/datum/effect/effect/system/grav_pull/set_up(range, num, loca)
pull_radius = range
number = num
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
/datum/effect/effect/system/grav_pull/start()
spawn(0)
if(holder)
src.location = get_turf(holder)
for(var/i=0, i < number, i++)
do_pull()
sleep(25)
/datum/effect/effect/system/grav_pull/proc/do_pull()
//following is adapted from supermatter and singulo code
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 1
// Let's just make this one loop.
for(var/atom/X in orange(pull_radius, location))
// Movable atoms only
if(istype(X, /atom/movable))
if(istype(X, /obj/effect/overlay)) continue
if(X && !istype(X, /mob/living/carbon/human))
if(break_windows && istype(X, /obj/structure/window)) //shatter windows
var/obj/structure/window/W = X
W.ex_act(2.0)
if(istype(X, /obj))
var/obj/O = X
if(O.anchored)
if (!pull_anchored) continue // Don't pull anchored stuff unless configured
step_towards(X, location) // step just once if anchored
continue
step_towards(X, location) // Step twice
step_towards(X, location)
else if(istype(X,/mob/living/carbon/human))
var/mob/living/carbon/human/H = X
if(istype(H.shoes,/obj/item/clothing/shoes/magboots))
var/obj/item/clothing/shoes/magboots/M = H.shoes
if(M.magpulse)
step_towards(H, location) //step just once with magboots
continue
step_towards(H, location) //step twice
step_towards(H, location)
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0
return

View File

@@ -0,0 +1,33 @@
// Micro Holders - Extends /obj/item/weapon/holder
/obj/item/weapon/holder/micro
name = "micro"
desc = "Another crewmember, small enough to fit in your hand."
icon_state = "micro"
slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID
w_class = 2
item_icons = null // Override value from parent. We don't have magic sprites.
pixel_y = 0 // Override value from parent.
/obj/item/weapon/holder/micro/examine(var/mob/user)
for(var/mob/living/M in contents)
M.examine(user)
/obj/item/weapon/holder/MouseDrop(mob/M as mob)
..()
if(M != usr) return
if(usr == src) return
if(!Adjacent(usr)) return
if(istype(M,/mob/living/silicon/ai)) return
for(var/mob/living/carbon/human/O in contents)
O.show_inv(usr)
/obj/item/weapon/holder/micro/attack_self(var/mob/living/user)
for(var/mob/living/carbon/human/M in contents)
M.help_shake_act(user)
/obj/item/weapon/holder/micro/update_state()
// If any items have been dropped by contained mob, drop them to floor.
for(var/obj/O in contents)
O.forceMove(get_turf(src))
..()

View File

@@ -0,0 +1,197 @@
//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
//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
// Adding needed defines to /mob/living
// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff.
/mob/living
var/size_multiplier = 1 //multiplier for the mob's icon size
// Define holder_type on types we want to be scoop-able
//mob/living/carbon/human
// holder_type = /obj/item/weapon/holder/micro
/**
* 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
* 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))
var/matrix/M = matrix()
M.Scale(size_multiplier)
M.Translate(0, 16*(size_multiplier-1))
src.transform = M
/**
* Get the effective size of a mob.
* Currently this is based only on size_multiplier for micro/macro stuff,
* but in the future we may also incorporate the "mob_size", so that
* a macro mouse is still only effectively "normal" or a micro dragon is still large etc.
*/
/mob/living/proc/get_effective_size()
return src.size_multiplier
/**
* 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
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
animate(src, transform = resize, 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"
var/nagmessage = "DO NOT ABUSE THESE COMMANDS. They are not here for you to play with. \
We were originally going to remove them but kept them for popular demand. \
Do not abuse their existence outside of ERP scenes where they apply, \
or reverting OOCly unwanted changes like someone lolshooting the crew with a shrink ray. -Ace"
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 ? "<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)
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;
if(M.buckled)
usr << "<span class='notice'>You have to unbuckle \the [M] before you pick them up.</span>"
return 0
if(M.get_effective_size() - src.get_effective_size() >= 0.75)
var/obj/item/weapon/holder/m_holder = get_scooped(M)
if (m_holder)
return 1
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)
// Both small! Go ahead and
now_pushing = 0
return 1
if(abs(src.get_effective_size() - tmob.get_effective_size()) >= 0.75)
now_pushing = 0
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
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
src << "You run between [tmob]'s legs."
tmob << "[src] runs between your legs."
return 1
/**
* Handle bumping into someone without mutual help intent.
* Called from /mob/living/Bump()
* NW was here, adding even more options for stomping!
*
* @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
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)
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
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)
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
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)
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
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
src << "You pin [tmob] beneath your foot!"
tmob << "[src] pins you beneath their foot!"
return 1
*/

View File

@@ -0,0 +1,83 @@
//
// 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."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "sizegun-shrink100" // Someone can probably do better. -Ace
item_state = null //so the human update icon uses the icon_state instead
fire_sound = 'sound/weapons/wave.ogg'
charge_cost = 100
projectile_type = /obj/item/projectile/beam/shrinklaser
origin_tech = "redspace=1;bluespace=4"
modifystate = "sizegun-shrink"
self_recharge = 1
firemodes = list(
list(mode_name = "grow",
projectile_type = /obj/item/projectile/beam/growlaser,
modifystate = "sizegun-grow",
fire_sound = 'sound/weapons/pulse3.ogg'
),
list(mode_name = "shrink",
projectile_type = /obj/item/projectile/beam/shrinklaser,
modifystate = "sizegun-shrink",
fire_sound = 'sound/weapons/wave.ogg'
))
//
// Beams for size gun
//
/obj/item/projectile/beam/shrinklaser
name = "shrink beam"
icon_state = "xray"
nodamage = 1
damage = 0
check_armour = "laser"
muzzle_type = /obj/effect/projectile/xray/muzzle
tracer_type = /obj/effect/projectile/xray/tracer
impact_type = /obj/effect/projectile/xray/impact
/obj/item/projectile/beam/shrinklaser/on_hit(var/atom/target, var/blocked = 0)
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()
return 1
/obj/item/projectile/beam/growlaser
name = "growth beam"
icon_state = "bluelaser"
nodamage = 1
damage = 0
check_armour = "laser"
muzzle_type = /obj/effect/projectile/laser_blue/muzzle
tracer_type = /obj/effect/projectile/laser_blue/tracer
impact_type = /obj/effect/projectile/laser_blue/impact
/obj/item/projectile/beam/growlaser/on_hit(var/atom/target, var/blocked = 0)
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()
return 1

View File

@@ -0,0 +1,62 @@
/*
This file is for jamming single-line procs into Polaris procs.
It will prevent runtimes and allow their code to run if VOREStation's fails.
It will also log when we mess up our code rather than making it vague.
Call it at the top of a stock proc with...
if(attempt_vr(object,proc to call,args)) return
...if you are replacing an entire proc.
The proc you're attemping should return nonzero values on success.
*/
/proc/attempt_vr(callon, procname, list/args=null)
try
if(!callon || !procname)
// error("attempt_vr: Invalid obj/proc: [callon]/[procname]")
return 0
var/result = call(callon,procname)(arglist(args))
return result
catch
log_admin("attempt_vr runtimed when calling [procname] on [callon].")
// error("attempt_vr catch: [e] on [e.file]:[e.line]")
// return 0
/*
This is the _vr version of calling hooks.
It's meant to have different messages, and also the try/catch block.
For when you want hooks and want to know when you ruin everything,
vs when Polaris ruins everything.
Call it at the top of a stock proc with...
if(hook_vr(proc,args)) return
...if you are replacing an entire proc.
The hooks you're calling should return nonzero values on success.
*/
/proc/hook_vr(hook, list/args=null)
try
var/hook_path = text2path("/hook/[hook]")
if(!hook_path)
// 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.")
status = 0
return status
catch
log_admin("hook_vr itself failed or runtimed. Exception below.")
// error("hook_vr catch: [e] on [e.file]:[e.line]")

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,141 @@
/obj/machinery/workout
name = "fitness lifter"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "fitnesslifter" //Sprites ripped from goon.
desc = "A utility often used to lose weight."
anchored = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/workout/attackby(obj/item/W, var/mob/living/user)
if(istype(W, /obj/item/weapon/wrench))
src.add_fingerprint(user)
user.visible_message("<span class='warning'>[user] has [anchored ? "un" : ""]secured \the [src].</span>", "<span class='notice'>You [anchored ? "un" : ""]secure \the [src].</span>")
anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
return
/obj/machinery/workout/attack_hand(var/mob/living/user)
if(!anchored)
user << "<span class='notice'>For safety reasons, you are required to have this equipment wrenched down before using it!</span>"
return
else if(user.loc != src.loc)
user << "<span class='notice'>For safety reasons, you need to be sitting in the fitness lifter for it to work!</span>"
return
else if(user.nutrition > 70 && user.weight > 70) //If they have enough nutrition and body weight, they can exercise.
user.setClickCooldown(40)
user.dir = src.dir
user.nutrition = user.nutrition - 20 //Working out burns a lot of calories!
user.weight = user.weight - 0.05 //Burn a bit of weight. Not much, but quite a bit. This can't be spammed, as they'll need nutrition to be able to work out.
flick("fitnesslifter2",src)
user << "<span class='notice'>You lift some weights.</span>"
else if(user.nutrition < 70)
user << "<span class='notice'>You need more energy to workout on the mat!</span>"
else if(user.weight < 70)
user << "<span class='notice'>You're too skinny to risk losing any more weight!</span>"
else
user << "<span class='notice'>You're unable to use the fitness lifter.</span>"
return //Something went wrong. They shouldn't see this.
/obj/machinery/workout/shipped
anchored = 0 // For cargo.
/obj/machinery/punching_bag
name = "punching bag"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "punchingbag"
desc = "A bag often used to releive stress and burn fat."
anchored = 1
density = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/punching_bag/attack_hand(var/mob/living/user)
if(user.nutrition > 35 && user.weight > 70) //If they have enough nutrition and body weight, they can exercise.
user.setClickCooldown(10)
user.nutrition = user.nutrition - 10 //A punching bag uses less calories.
user.weight = user.weight - 0.025 //And burns less weight.
flick("punchingbag2",src)
var/message = pick(
"<span class='notice'>You slam your fist into the punching bag.</span>",
"<span class='notice'>You jab the punching bag with your elbow.</span>")
user << message
playsound(src.loc, "punch", 50, 1)
else if(user.nutrition < 35)
user << "<span class='notice'>You need more energy to workout on the mat!</span>"
else if(user.weight < 70)
user << "<span class='notice'>You're too skinny to risk losing any more weight!</span>"
else
user << "<span class='notice'>You're unable to use the punching bag.</span>"
return //Something went wrong. They shouldn't see this.
/obj/machinery/punching_clown
name = "clown punching bag"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "bopbag"
desc = "A bag often used to releive stress and burn fat. It has a clown on the front of it."
anchored = 0
density = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/punching_clown/attack_hand(var/mob/living/user)
if(user.nutrition > 35 && user.weight > 70) //If they have enough nutrition and body weight, they can exercise.
user.setClickCooldown(10)
user.nutrition = user.nutrition - 10
user.weight = user.weight - 0.025
flick("bopbag2",src)
var/message = pick(
"<span class='notice'>You slam your fist into the punching bag.</span>",
"<span class='notice'>You jab the punching bag with your elbow.</span>",
"<span class='notice'>You hammer the clown right in it's face with your fist.</span>",
"<span class='notice'>A honk emits from the punching bag as you hit it.</span>")
user << message
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
playsound(src.loc, "clownstep", 50, 1)
playsound(src.loc, "punch", 50, 1)
else if(user.nutrition < 35)
user << "<span class='notice'>You need more energy to workout on the mat!</span>"
else if(user.weight < 70)
user << "<span class='notice'>You're too skinny to risk losing any more weight!</span>"
else
user << "<span class='notice'>You're unable to use the punching bag.</span>"
return //Something went wrong. They shouldn't see this.
/obj/machinery/scale
name = "scale"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "scale"
desc = "A scale used to measure ones weight relative to their size and species."
anchored = 1 // Set to 0 when we can construct or dismantle these.
use_power = 0
idle_power_usage = 0
active_power_usage = 0
var/kilograms
/obj/machinery/scale/attack_hand(var/mob/living/user)
if(user.loc != src.loc)
user << "<span class='notice'>You need to be standing on top of the scale for it to work!</span>"
return
if(user.weight) //Just in case.
kilograms = round(text2num(user.weight),4) / 2.20463
user << "<span class='notice'>Your relative weight is [user.weight]lb / [kilograms]kg.</span>"
user.visible_message("<span class='warning'>[user]'s relative weight is [user.weight]lb / [kilograms]kg.</span>")

View File

@@ -1,6 +0,0 @@
var/list/whitelist_keys=new()
proc/is_whitelisted(var/keychk)
keychk=ckey(keychk)
if(whitelist_keys.Find(keychk))
return 1
return 0

39
code/controllers/hooks.dm Normal file
View File

@@ -0,0 +1,39 @@
/**
* @file hooks.dm
* Implements hooks, a simple way to run code on pre-defined events.
*/
/** @page hooks Code hooks
* @section hooks Hooks
* A hook is defined under /hook in the type tree.
*
* To add some code to be called by the hook, define a proc under the type, as so:
* @code
/hook/foo/proc/bar()
if(1)
return 1 //Sucessful
else
return 0 //Error, or runtime.
* @endcode
* All hooks must return nonzero on success, as runtimes will force return null.
*/
/**
* Calls a hook, executing every piece of code that's attached to it.
* @param hook Identifier of the hook to call.
* @returns 1 if all hooked code runs successfully, 0 otherwise.
*/
/proc/callHook(hook, list/args=null)
var/hook_path = text2path("/hook/[hook]")
if(!hook_path)
// error("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 '[P]' failed or runtimed.")
status = 0
return status

View File

@@ -186,6 +186,16 @@
H.adjustBrainLoss(CLONE_INITIAL_DAMAGE) H.adjustBrainLoss(CLONE_INITIAL_DAMAGE)
H.Paralyse(4) H.Paralyse(4)
if(H.client.prefs)
H.vore_organs = H.client.prefs.belly_prefs.Copy()
for(var/I in H.vore_organs)
var/datum/belly/B = H.vore_organs[I]
B.owner = H
B.internal_contents = list()
B.digest_mode = DM_HOLD
// H.flavor_text = R.flavor.Copy()
if(grab_ghost_when == CLONER_FRESH_CLONE) if(grab_ghost_when == CLONER_FRESH_CLONE)
clonemind.transfer_to(H) clonemind.transfer_to(H)
H.ckey = ckey H.ckey = ckey

View File

@@ -105,6 +105,10 @@ var/list/preferences_datums = list()
//var/metadata = "" //var/metadata = ""
var/flavor_text = "" var/flavor_text = ""
// Vore prefs
var/digestable = 1
var/list/belly_prefs = list()
var/unlock_content = 0 var/unlock_content = 0
var/list/ignoring = list() var/list/ignoring = list()
@@ -123,6 +127,8 @@ var/list/preferences_datums = list()
var/loaded_preferences_successfully = load_preferences() var/loaded_preferences_successfully = load_preferences()
if(loaded_preferences_successfully) if(loaded_preferences_successfully)
if(load_character()) if(load_character())
if(load_vore_preferences())
return
return return
//we couldn't load character data so just randomize the character appearance + name //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. 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") if("save")
save_preferences() save_preferences()
save_character() save_character()
save_vore_preferences()
if("load") if("load")
load_preferences() load_preferences()
load_character() load_character()
load_vore_preferences()
if("changeslot") if("changeslot")
load_vore_preferences(text2num(href_list["num"]))
if(!load_character(text2num(href_list["num"]))) if(!load_character(text2num(href_list["num"])))
random_character() random_character()
real_name = random_unique_name(gender) real_name = random_unique_name(gender)
@@ -1289,6 +1298,23 @@ var/list/preferences_datums = list()
character.name = character.real_name character.name = character.real_name
character.flavor_text = flavor_text 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.gender = gender
character.age = age character.age = age

View File

@@ -172,6 +172,44 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
backbag = DBACKPACK 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") /datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey) if(!ckey)
return return

View File

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

View File

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

View File

@@ -367,13 +367,13 @@
skipcatch = 1 //can't catch the now embedded item skipcatch = 1 //can't catch the now embedded item
return ..() 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) /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)) if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && iscarbon(pulling))
devour_mob(pulling) vore_attack(user, pulling)
else else
..() ..()
*/
/mob/living/carbon/human/grippedby(mob/living/user) /mob/living/carbon/human/grippedby(mob/living/user)
if(w_uniform) if(w_uniform)
w_uniform.add_fingerprint(user) w_uniform.add_fingerprint(user)

View File

@@ -46,6 +46,8 @@
if(loc) if(loc)
environment = loc.return_air() environment = loc.return_air()
if(ismob(loc)) return
var/datum/gas_mixture/breath var/datum/gas_mixture/breath
if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube")))

View File

@@ -211,12 +211,12 @@
/mob/living/acid_act(acidpwr, toxpwr, acid_volume) /mob/living/acid_act(acidpwr, toxpwr, acid_volume)
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr)) take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) /mob/living/proc/grabbedby(mob/living/carbon/user, mob/living/target, supress_message = 0)
// if(user == src)
// var/mob/living/target // if(grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling) && user.zone_selected == "mouth")
// if(pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) // 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
// target = pulling // return
// user.vore_initiate(target,user)
if(anchored) if(anchored)
return 0 return 0
if(!user.pulling || user.pulling != src) if(!user.pulling || user.pulling != src)

View File

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

View File

@@ -22,6 +22,7 @@ var/next_mob_id = 0
else else
living_mob_list += src living_mob_list += src
prepare_huds() prepare_huds()
hook_vr("mob_new",list(src))
..() ..()
/atom/proc/prepare_huds() /atom/proc/prepare_huds()

View File

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

View File

@@ -8,4 +8,4 @@
# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. #
############################################################################################### ###############################################################################################
JayEh = Host Jayehh = Host

Binary file not shown.

BIN
sound/vore/death1.ogg Normal file

Binary file not shown.

BIN
sound/vore/death10.ogg Normal file

Binary file not shown.

BIN
sound/vore/death2.ogg Normal file

Binary file not shown.

BIN
sound/vore/death3.ogg Normal file

Binary file not shown.

BIN
sound/vore/death4.ogg Normal file

Binary file not shown.

BIN
sound/vore/death5.ogg Normal file

Binary file not shown.

BIN
sound/vore/death6.ogg Normal file

Binary file not shown.

BIN
sound/vore/death7.ogg Normal file

Binary file not shown.

BIN
sound/vore/death8.ogg Normal file

Binary file not shown.

BIN
sound/vore/death9.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest1.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest10.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest11.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest12.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest2.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest3.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest4.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest5.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest6.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest7.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest8.ogg Normal file

Binary file not shown.

BIN
sound/vore/digest9.ogg Normal file

Binary file not shown.

BIN
sound/vore/gulp.ogg Normal file

Binary file not shown.

BIN
sound/vore/insert.ogg Normal file

Binary file not shown.

BIN
sound/vore/insertion1.ogg Normal file

Binary file not shown.

BIN
sound/vore/insertion2.ogg Normal file

Binary file not shown.

BIN
sound/vore/insertion3.ogg Normal file

Binary file not shown.

BIN
sound/vore/schlorp.ogg Normal file

Binary file not shown.

BIN
sound/vore/squish1.ogg Normal file

Binary file not shown.

BIN
sound/vore/squish2.ogg Normal file

Binary file not shown.

BIN
sound/vore/squish3.ogg Normal file

Binary file not shown.

BIN
sound/vore/squish4.ogg Normal file

Binary file not shown.

View File

@@ -70,8 +70,10 @@
#include "code\__HELPERS\radio.dm" #include "code\__HELPERS\radio.dm"
#include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\text.dm" #include "code\__HELPERS\text.dm"
#include "code\__HELPERS\text_vr.dm"
#include "code\__HELPERS\time.dm" #include "code\__HELPERS\time.dm"
#include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\type2type_vr.dm"
#include "code\__HELPERS\unsorted.dm" #include "code\__HELPERS\unsorted.dm"
#include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\__main.dm"
#include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\InsertSort.dm"
@@ -128,10 +130,21 @@
#include "code\_onclick\hud\swarmer.dm" #include "code\_onclick\hud\swarmer.dm"
#include "code\citadel\_helpers.dm" #include "code\citadel\_helpers.dm"
#include "code\citadel\organs.dm" #include "code\citadel\organs.dm"
#include "code\citadel\vore\hook-defs_vr.dm"
#include "code\citadel\vore\trycatch_vr.dm"
#include "code\citadel\vore\eating\belly_vr.dm"
#include "code\citadel\vore\eating\bellymodes_vr.dm"
#include "code\citadel\vore\eating\living_vr.dm"
#include "code\citadel\vore\eating\simple_animal_vr.dm"
#include "code\citadel\vore\eating\vore_vr.dm"
#include "code\citadel\vore\eating\vorehooks_vr.dm"
#include "code\citadel\vore\eating\vorepanel_vr.dm"
#include "code\citadel\vore\resizing\resize_vr.dm"
#include "code\controllers\admin.dm" #include "code\controllers\admin.dm"
#include "code\controllers\configuration.dm" #include "code\controllers\configuration.dm"
#include "code\controllers\controller.dm" #include "code\controllers\controller.dm"
#include "code\controllers\failsafe.dm" #include "code\controllers\failsafe.dm"
#include "code\controllers\hooks.dm"
#include "code\controllers\master.dm" #include "code\controllers\master.dm"
#include "code\controllers\subsystem.dm" #include "code\controllers\subsystem.dm"
#include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\air.dm"
@@ -995,6 +1008,7 @@
#include "code\modules\client\preferences.dm" #include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\preferences_toggles.dm"
#include "code\modules\client\preferences_vr.dm"
#include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\engine_goggles.dm"
@@ -1273,6 +1287,7 @@
#include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm" #include "code\modules\mob\say.dm"
#include "code\modules\mob\say_vr.dm"
#include "code\modules\mob\status_procs.dm" #include "code\modules\mob\status_procs.dm"
#include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\update_icons.dm" #include "code\modules\mob\update_icons.dm"
@@ -1351,6 +1366,7 @@
#include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\death.dm"
#include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\emote.dm"
#include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\examine.dm"
#include "code\modules\mob\living\carbon\human\examine_vr.dm"
#include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human.dm"
#include "code\modules\mob\living\carbon\human\human_attackalien.dm" #include "code\modules\mob\living\carbon\human\human_attackalien.dm"
#include "code\modules\mob\living\carbon\human\human_attackhand.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm"