#define CONTIGUOUS_WALLS 1 #define CONTIGUOUS_FLOORS 2 #define TURF_FLOOR 0 #define TURF_WALL 1 var/global/list/mining_surprises = subtypesof(/mining_surprise) /surprise_turf_info var/list/types[0] var/list/adjacents var/turf_type=TURF_FLOOR New() adjacents=list( "[NORTH]"=list(), "[SOUTH]"=list(), "[EAST]"=list(), "[WEST]"=list() ) proc/GetAdjacentTypes(var/dir) return adjacents["[dir]"] /surprise_room var/list/turfs[0] // Used for layout system. var/list/turf_info[0] var/size_x=0 var/size_y=0 proc/UpdateTurfs() for(var/turf/T in turfs) UpdateTurf(T) proc/GetTurfs(var/ttype) var/list/selected[0] for(var/turf/T in turfs) var/surprise_turf_info/Ti = GetTurfInfo(T) if(Ti.turf_type==ttype) selected |= T return selected proc/GetTurfInfo(var/turf/T) var/surprise_turf_info/sti if(!(T in turf_info)) sti = new turf_info[T]=sti else sti = turf_info[T] return sti proc/UpdateTurf(var/turf/T, var/no_adjacent=0) // List types in this turf. var/surprise_turf_info/sti = GetTurfInfo(T) sti.types=0 for(var/atom/A in T.contents) sti.types |= A.type if(no_adjacent) return UpdateAdjacentsOfTurf(T) proc/AddTypeToTurf(var/turf/T, var/newtype) var/surprise_turf_info/sti = GetTurfInfo(T) sti.types |= newtype //UpdateAdjacentsOfTurf(T) proc/UpdateAdjacentsOfTurf(var/turf/T) var/surprise_turf_info/Ti = turf_info[T] for(var/dir in cardinal) var/turf/AT = get_step(T,dir) if(!(AT in turfs)) return if(!(AT in turf_info)) UpdateTurf(AT, no_adjacent=1) var/surprise_turf_info/ATi = turf_info[AT] // By-Ref so shit gets updated. ATi.adjacents["[reverse_direction(dir)]"]=Ti.types // For room layouts. /layout_rule var/mining_surprise/root var/surprise_room/room // What to place if true var/placetype=null var/min_to_place=5 // Force placement at ALL candidates. var/max_to_place=10 // 0 = max amount of ALL candidates. var/placed_times=0 var/list/decorations=list() // types, empty for no decorations var/flags = 0 New(var/mining_surprise/_root,var/surprise_room/_room) root=_root room=_room // Called in Evaluate proc/Plop(var/turf/T) new placetype(T) placed_times++ room.AddTypeToTurf(T,placetype) if(decorations.len) var/decoration = pickweight(decorations) new decoration(T) room.AddTypeToTurf(T,decoration) // Return 1 if we Plop()'d something. // Return 0 if we didn't or something went wrong. proc/Evaluate() var/list/candidates=GetCandidates() if(candidates.len==0) return 0 if(max_to_place<=0) max_to_place=candidates.len var/n=candidates.len if(min_to_place>0) n = min(candidates.len,rand(min_to_place,max_to_place)) if(n==0) return 0 for(var/i=0;i