|
Well I thought about making a whole bunch of datums for everything I could possibly need and then putting them in one library I can include in my projects. So far I have a String Datum, points, and a color datum, I have another assortment of procs but focusing on the datums right now. Any suggestions on how to improve the current ones and anyone have ideas for future datums?
Definitions:
#define ILLEGAL 1 #define ALLOWED 2
#define ROUND 1 #define NOROUND 0
#define BACK 1 #define FRONT 2
#define NO_MAX null
#define NUMBERS list("0","1","2","3","4","5","6","7","8","9") #define LALPHABET list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") #define UALPHABET list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") #define ALPHABET list("A","a","B","b","C","c","D","d","E","e","F","f","G","g","H","h","I","i","J","j","K","k","L","l",\ "M","m","N","n","O","o","P","p","Q","q","R","r","S","s","T","t","U","u","V","v","W","w","X","x","Y","y","Z","z")
|
String Datum:
String var text = "" max_length = null list/filter filter_mode = ILLEGAL proc append(Append as text, Direction=BACK) if(max_length != null && length(Append)+text_length() <= max_length) {if(Direction==BACK){text+=Append;};else{text=Append+text;};filter();return 1} else if(Append) {if(Direction==BACK){text+=Append;};else{text=Append+text;};filter();return 1} return 0 set_max_length(new_max_length) if(new_max_length && new_max_length > 0) max_length = new_max_length if(text_length() > max_length) text = copytext( text, 1, max_length+1 ) return 0 insert(Insert as text, Place=text_length()+1) return copytext(text, 1, Place)+Insert+copytext(text, Place+1) set_filter(var/list/X) if(X && length(X)){filter=list();filter=X;filter();return 1;} return 0 set_filter_mode(NewMode = ILLEGAL) if(NewMode != ILLEGAL && NewMode != ALLOWED) return 0 filter_mode = NewMode return 1 filter() if(filter && filter.len) if(src.filter_mode == ILLEGAL) for(var/v in filter){replace(v, filter[v]?filter[v]:"")} return 1 if(src.filter_mode == ALLOWED) var/t var/new_text = text for(var/i=1 to text_length()) t = copytext(text, i, i+1) if(!filter.Find(t)) new_text = textreplaceEx(new_text, t, "") text = new_text return 1 else return 0 replace(Replace as text, Replacement as text) text = textreplace(text, Replace, Replacement) replaceEx(Replace as text, Replacement as text) text = textreplaceEx(text, Replace, Replacement) text_length() return length(text) get() return text set_text(Newtext as text) if(max_length != null && max_length >= length(Newtext)){text=Newtext;filter();return 1;} return 0 append_string(String/Append, Direction=BACK) if(Append){append(Append.text, Direction);return 1;} return 0 random_append(Characters=1, Direction=BACK, ascii_min=97, ascii_max=122) while(Characters) append( ascii2text(rand(ascii_min, ascii_max)), Direction ) Characters-- New( new_text as text, new_max_length as num, list/new_filter, new_filter_mode as num ) if(new_max_length) max_length = new_max_length if(new_text) set_text(new_text) if(new_filter_mode) set_filter_mode(new_filter_mode) if(new_filter) set_filter(new_filter)
proc String( new_text as text, new_max_length as num, list/new_filter, new_filter_mode as num ) return new/String (new_text, new_max_length, new_filter, new_filter_mode)
|
Points:
point var x = 0 y = 0 New(_x, _y) if(_x) x = _x if(_y) y = _y proc/SetPoints(_x, _y) if(_x) x = _x if(_y) y = _y proc point(_x_, _y_, should_round) if(!should_round) return new/point(_x_, _y_) else return new/point(round(_x_), round(_y_)) text_point(text, should_round) var/comma = findtext(text, ",") var/_x_ = copytext(text, 1, comma) var/_y_ = copytext(text, comma+1, length(text)+1) return point(should_round?round(text2num(_x_)):text2num(_x_), should_round?round(text2num(_y_)):text2num(_y_))
point3 var x = 0 y = 0 z = 0 New(_x, _y, _z) if(_x) x = _x if(_y) y = _y if(_z) z = _z proc point3(_x_=0, _y_=_x_,_z_=1,should_round = NOROUND) if(!should_round) new/point3(_x_, _y_, _z_) else return new/point3(round(_x_),round(_y_),round(_z_))
|
Colors:
proc getAlpha(hex) if(length(hex) < 9) return 255 else hex = uppertext(hex) var hi = text2ascii(hex,8) lo = text2ascii(hex,8) return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) ) getRed(hex) hex = uppertext(hex) var hi = text2ascii(hex, 2) lo = text2ascii(hex, 3) return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
getGreen(hex) hex = uppertext(hex) var hi = text2ascii(hex, 4) lo = text2ascii(hex, 5) return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
getBlue(hex) hex = uppertext(hex) var hi = text2ascii(hex, 6) lo = text2ascii(hex, 7) return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
GetColors(hex) return list( getRed(hex), getGreen(hex), getBlue(hex), getAlpha(hex) )
Color var r = 0 g = 0 b = 0 a = 255 value = "#000000"
New(_R, _G, _B, _A) ..() if(!_R&&!_G&&!_B&&!_A) value = null r = null g = null b = null a = 0 else if(_R&&istext(_R)) value = _R make_rgb() else if(_R) r=_R if(_G) g=_G if(_B) b=_B if(_A) a=_A value = rgb(r, g, b, a)
proc make_rgb() r = getRed(value) g = getGreen(value) b = getBlue(value) a = getAlpha(value) make_color() value = rgb(min(max(r, 0), 255), min(max(g, 0), 255), min(max(b, 0), 255), min(max(a, 0), 255)) set_rgba(new_r, new_g, new_b, new_a) r = min(max(new_r, 0), 255) g = min(max(new_g, 0), 255) b = min(max(new_b, 0), 255) a = min(max(new_a, 0), 255) make_color() set_r(val) val = min(max(val, 0), 255) r = val make_color() set_g(val) val = min(max(val, 0), 255) g = val make_color() set_b(val) val = min(max(val, 0), 255) b = val make_color() set_a(val) val = min(max(val, 0), 255) a = val make_color() Cset_value(val) if(length(val) > 8) val = copytext(val, 1, 9) if(copytext(val, 1,2) != "#") val = "#[val]" value = val make_rgb() set_value(val) value = val make_rgb()
proc Color(_r, _g, _b, _a) return new/Color(_r, _g, _b, _a)
|
necessary procs:
proc textreplace(text as text, to_replace as text, replacement as text) var/pos = findtext(text, to_replace) var/replacement_length = length(replacement) var/to_replace_length = length(to_replace) while(pos) text = copytext(text, 1, pos)+replacement+copytext(text, pos+to_replace_length) pos = findtext(text, to_replace, pos+replacement_length) return text textreplaceEx(text as text, to_replace as text, replacement as text) var/pos = findtextEx(text, to_replace) var/replacement_length = length(replacement) var/to_replace_length = length(to_replace) while(pos) text = copytext(text, 1, pos)+replacement+copytext(text, pos+to_replace_length) pos = findtextEx(text, to_replace, pos+replacement_length) return text
|
|
However on other hand, it's quite useless on BYOND. Compared to how slow new() proc is, it'd impossible to make anything decent.