#import "Variable.h" #include "cube.h" @implementation Variable + (instancetype)variableWithName:(OFString *)name min:(int)min max:(int)max storage:(int *)storage function:(void (*__cdecl)())function persisted:(bool)persisted { return [[self alloc] initWithName:name min:min max:max storage:storage function:function persisted:persisted]; } - (instancetype)initWithName:(OFString *)name min:(int)min max:(int)max storage:(int *)storage function:(void (*__cdecl)())function persisted:(bool)persisted { self = [super initWithName:name]; _min = min; _max = max; _storage = storage; _function = function; _persisted = persisted; return self; } - (void)printValue { conoutf(@"%@ = %d", self.name, *_storage); } - (void)setValue:(int)value { bool outOfRange = false; if (_min > _max) { conoutf(@"variable is read-only"); return; } if (value < _min) { value = _min; outOfRange = true; } if (value > _max) { value = _max; outOfRange = true; } if (outOfRange) conoutf(@"valid range for %@ is %d..%d", self.name, _min, _max); *_storage = value; if (_function != NULL) // call trigger function if available _function(); } @end