mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
add the beginnings of a library for mods and a mod using the new features
of qfcc. doesn't do much yet.
This commit is contained in:
parent
520a3c0a90
commit
bbaaaae81c
26 changed files with 935 additions and 0 deletions
5
ruamoko/game/.gitignore
vendored
Normal file
5
ruamoko/game/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
*.d
|
||||
*.dat
|
||||
*.qfo
|
||||
*.sym
|
||||
.vimrc
|
31
ruamoko/game/Makefile
Normal file
31
ruamoko/game/Makefile
Normal file
|
@ -0,0 +1,31 @@
|
|||
QFCC=qfcc
|
||||
QCFLAGS=-qq -g -Werror
|
||||
QCPPFLAGS=-I../include
|
||||
|
||||
game_source = \
|
||||
axe.r \
|
||||
gameent.r \
|
||||
message.r \
|
||||
sound.r \
|
||||
tempent.r \
|
||||
trace.r \
|
||||
vector.r \
|
||||
world.r
|
||||
|
||||
game_obj = $(addsuffix .qfo,$(basename $(game_source)))
|
||||
game_dep = $(addsuffix .d,$(basename $(game_source)))
|
||||
|
||||
%.qfo: %.r
|
||||
@$(QFCC) -M $(QCPPFLAGS) -c $< | sed -e 's/\.r\.o\>/.qfo/' > `basename $@ .qfo`.d
|
||||
$(QFCC) $(QCFLAGS) $(QCPPFLAGS) -c -o $@ $<
|
||||
|
||||
%.qfo: %.qc
|
||||
$(QFCC) $(QCFLAGS) $(QCPPFLAGS) -c -o $@ $<
|
||||
|
||||
game.dat: $(game_obj) ../lib/libr.pak
|
||||
$(QFCC) -qq -g -o $@ $(game_obj) -l../lib/libr.pak
|
||||
|
||||
clean:
|
||||
rm -f *.qfo *.dat *.sym *.d
|
||||
|
||||
-include $(game_dep)
|
15
ruamoko/game/axe.h
Normal file
15
ruamoko/game/axe.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
#ifndef __axe_h
|
||||
#define __axe_h
|
||||
|
||||
#include "entity.h"
|
||||
#include "weapon.h"
|
||||
|
||||
@interface Axe : Object <Weapon>
|
||||
{
|
||||
Entity owner;
|
||||
float damage;
|
||||
}
|
||||
-init;
|
||||
@end
|
||||
|
||||
#endif//__axe_h
|
54
ruamoko/game/axe.r
Normal file
54
ruamoko/game/axe.r
Normal file
|
@ -0,0 +1,54 @@
|
|||
#include "axe.h"
|
||||
#include "gameent.h"
|
||||
#include "message.h"
|
||||
#include "sound.h"
|
||||
#include "tempent.h"
|
||||
#include "trace.h"
|
||||
#include "vector.h"
|
||||
#include "world.h"
|
||||
|
||||
@implementation Axe
|
||||
|
||||
-init
|
||||
{
|
||||
[super init];
|
||||
damage = (deathmatch > 3) ? 75.0 : 20.0;
|
||||
return self;
|
||||
}
|
||||
|
||||
-setOwner:(Entity)o
|
||||
{
|
||||
owner = o;
|
||||
return self;
|
||||
}
|
||||
|
||||
-fire
|
||||
{
|
||||
local entity s = [owner ent];
|
||||
local vector org, source;
|
||||
|
||||
makevectors (s.v_angle);
|
||||
source = s.origin + '0 0 16';
|
||||
traceline (source, source + v_forward * 64, NO, s);
|
||||
if (trace_fraction == 1.0)
|
||||
return self;
|
||||
|
||||
org = trace_endpos - v_forward * 4;
|
||||
|
||||
if ([trace_ent.@this takeDamage:self inflictor:s attacker:s :damage])
|
||||
SpawnBlood (org, 20);
|
||||
else {
|
||||
sound (s, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
|
||||
|
||||
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||||
WriteByte (MSG_MULTICAST, TE_GUNSHOT);
|
||||
WriteByte (MSG_MULTICAST, 3);
|
||||
WriteCoord (MSG_MULTICAST, org_x);
|
||||
WriteCoord (MSG_MULTICAST, org_y);
|
||||
WriteCoord (MSG_MULTICAST, org_z);
|
||||
multicast (org, MULTICAST_PVS);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
23
ruamoko/game/gameent.h
Normal file
23
ruamoko/game/gameent.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
#ifndef __gameent_h
|
||||
#define __gameent_h
|
||||
|
||||
#include "entity.h"
|
||||
|
||||
@extern .vector angles;
|
||||
@extern .float modelindex;
|
||||
@extern .float movetype;
|
||||
@extern .string model;
|
||||
@extern .float frame;
|
||||
@extern .float colormap;
|
||||
@extern .vector mins;
|
||||
@extern .vector maxs;
|
||||
@extern .vector velocity;
|
||||
@extern .vector origin;
|
||||
@extern .float flags;
|
||||
@extern .vector v_angle;
|
||||
|
||||
@interface GameEntity : Entity
|
||||
-(BOOL)takeDamage:weapon :inflictor :attacker :(float)damage;
|
||||
@end
|
||||
|
||||
#endif//__gameent_h
|
21
ruamoko/game/gameent.r
Normal file
21
ruamoko/game/gameent.r
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include "gameent.h"
|
||||
|
||||
.vector angles;
|
||||
.float modelindex;
|
||||
.float movetype;
|
||||
.string model;
|
||||
.float frame;
|
||||
.float colormap;
|
||||
.vector mins;
|
||||
.vector maxs;
|
||||
.vector velocity;
|
||||
.vector origin;
|
||||
.float flags;
|
||||
.vector v_angle;
|
||||
|
||||
@implementation GameEntity
|
||||
-(BOOL)takeDamage:weapon :inflictor :attacker :damage
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
@end
|
51
ruamoko/game/message.h
Normal file
51
ruamoko/game/message.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
#ifndef __message_h
|
||||
#define __message_h
|
||||
|
||||
// protocol bytes
|
||||
#define SVC_TEMPENTITY 23
|
||||
#define SVC_KILLEDMONSTER 27
|
||||
#define SVC_FOUNDSECRET 28
|
||||
#define SVC_INTERMISSION 30
|
||||
#define SVC_FINALE 31
|
||||
#define SVC_CDTRACK 32
|
||||
#define SVC_SELLSCREEN 33
|
||||
#define SVC_SMALLKICK 34
|
||||
#define SVC_BIGKICK 35
|
||||
#define SVC_MUZZLEFLASH 39
|
||||
|
||||
// messages
|
||||
#define MSG_BROADCAST 0
|
||||
#define MSG_ONE 1
|
||||
#define MSG_ALL 2
|
||||
#define MSG_INIT 3
|
||||
#define MSG_MULTICAST 4
|
||||
|
||||
// message levels
|
||||
#define PRINT_LOW 0
|
||||
#define PRINT_MEDIUM 1
|
||||
#define PRINT_HIGH 2
|
||||
#define PRINT_CHAT 3
|
||||
|
||||
// multicast sets
|
||||
#define MULTICAST_ALL 0
|
||||
#define MULTICAST_PHS 1
|
||||
#define MULTICAST_PVS 2
|
||||
#define MULTICAST_ALL_R 3
|
||||
#define MULTICAST_PHS_R 4
|
||||
#define MULTICAST_PVS_R 5
|
||||
|
||||
//
|
||||
// direct client message generation
|
||||
//
|
||||
@extern void(float to, float f) WriteByte;
|
||||
@extern void(float to, float f) WriteChar;
|
||||
@extern void(float to, float f) WriteShort;
|
||||
@extern void(float to, float f) WriteLong;
|
||||
@extern void(float to, float f) WriteCoord;
|
||||
@extern void(float to, float f) WriteAngle;
|
||||
@extern void(float to, string s) WriteString;
|
||||
@extern void(float to, entity s) WriteEntity;
|
||||
|
||||
@extern void(vector where, float set) multicast;
|
||||
|
||||
#endif//__message_h
|
12
ruamoko/game/message.r
Normal file
12
ruamoko/game/message.r
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include "message.h"
|
||||
|
||||
void(float to, float f) WriteByte = #52;
|
||||
void(float to, float f) WriteChar = #53;
|
||||
void(float to, float f) WriteShort = #54;
|
||||
void(float to, float f) WriteLong = #55;
|
||||
void(float to, float f) WriteCoord = #56;
|
||||
void(float to, float f) WriteAngle = #57;
|
||||
void(float to, string s) WriteString = #58;
|
||||
void(float to, entity s) WriteEntity = #59;
|
||||
// sends the temp message to a set of clients, possibly in PVS or PHS
|
||||
void(vector where, float set) multicast = #82;
|
18
ruamoko/game/sound.h
Normal file
18
ruamoko/game/sound.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#ifndef __sound_h
|
||||
#define __sound_h
|
||||
|
||||
#define CHAN_AUTO 0
|
||||
#define CHAN_WEAPON 1
|
||||
#define CHAN_VOICE 2
|
||||
#define CHAN_ITEM 3
|
||||
#define CHAN_BODY 4
|
||||
#define CHAN_NO_PHS_ADD 8
|
||||
|
||||
#define ATTN_NONE 0
|
||||
#define ATTN_NORM 1
|
||||
#define ATTN_IDLE 2
|
||||
#define ATTN_STATIC 3
|
||||
|
||||
@extern void(entity e, float chan, string samp, float vol, float atten) sound;
|
||||
|
||||
#endif
|
3
ruamoko/game/sound.r
Normal file
3
ruamoko/game/sound.r
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include "sound.h"
|
||||
|
||||
void(entity e, float chan, string samp, float vol, float atten) sound = #0;
|
21
ruamoko/game/tempent.h
Normal file
21
ruamoko/game/tempent.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
#ifndef __tempent_h
|
||||
#define __tempent_h
|
||||
|
||||
#define TE_SPIKE 0
|
||||
#define TE_SUPERSPIKE 1
|
||||
#define TE_GUNSHOT 2
|
||||
#define TE_EXPLOSION 3
|
||||
#define TE_TAREXPLOSION 4
|
||||
#define TE_LIGHTNING1 5
|
||||
#define TE_LIGHTNING2 6
|
||||
#define TE_WIZSPIKE 7
|
||||
#define TE_KNIGHTSPIKE 8
|
||||
#define TE_LIGHTNING3 9
|
||||
#define TE_LAVASPLASH 10
|
||||
#define TE_TELEPORT 11
|
||||
#define TE_BLOOD 12
|
||||
#define TE_LIGHTNINGBLOOD 13
|
||||
|
||||
@extern void(vector org, float damage) SpawnBlood;
|
||||
|
||||
#endif//__tempent_h
|
13
ruamoko/game/tempent.r
Normal file
13
ruamoko/game/tempent.r
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include "message.h"
|
||||
#include "tempent.h"
|
||||
|
||||
void(vector org, float damage) SpawnBlood =
|
||||
{
|
||||
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||||
WriteByte (MSG_MULTICAST, TE_BLOOD);
|
||||
WriteByte (MSG_MULTICAST, 1);
|
||||
WriteCoord (MSG_MULTICAST, org_x);
|
||||
WriteCoord (MSG_MULTICAST, org_y);
|
||||
WriteCoord (MSG_MULTICAST, org_z);
|
||||
multicast (org, MULTICAST_PVS);
|
||||
};
|
17
ruamoko/game/trace.h
Normal file
17
ruamoko/game/trace.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#ifndef __trace_h
|
||||
#define __trace_h
|
||||
|
||||
// set by traceline / tracebox
|
||||
@extern float trace_allsolid;
|
||||
@extern float trace_startsolid;
|
||||
@extern float trace_fraction;
|
||||
@extern vector trace_endpos;
|
||||
@extern vector trace_plane_normal;
|
||||
@extern float trace_plane_dist;
|
||||
@extern entity trace_ent;
|
||||
@extern float trace_inopen;
|
||||
@extern float trace_inwater;
|
||||
|
||||
@extern void(vector v1, vector v2, float nomonsters, entity forent) traceline;
|
||||
|
||||
#endif//__trace_h
|
14
ruamoko/game/trace.r
Normal file
14
ruamoko/game/trace.r
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include "trace.h"
|
||||
|
||||
// set by traceline / tracebox
|
||||
float trace_allsolid;
|
||||
float trace_startsolid;
|
||||
float trace_fraction;
|
||||
vector trace_endpos;
|
||||
vector trace_plane_normal;
|
||||
float trace_plane_dist;
|
||||
entity trace_ent;
|
||||
float trace_inopen;
|
||||
float trace_inwater;
|
||||
|
||||
void(vector v1, vector v2, float nomonsters, entity forent) traceline = #0;
|
7
ruamoko/game/vector.h
Normal file
7
ruamoko/game/vector.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#ifndef __vector_h
|
||||
#define __vector_h
|
||||
|
||||
@extern vector v_forward, v_up, v_right; // set by makevectors()
|
||||
@extern void(vector ang) makevectors;
|
||||
|
||||
#endif//__vector_h
|
5
ruamoko/game/vector.r
Normal file
5
ruamoko/game/vector.r
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include "vector.h"
|
||||
|
||||
vector v_forward, v_up, v_right; // set by makevectors()
|
||||
void(vector ang) makevectors = #0;
|
||||
|
11
ruamoko/game/weapon.h
Normal file
11
ruamoko/game/weapon.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef __weapon_h
|
||||
#define __weapon_h
|
||||
|
||||
#include "entity.h"
|
||||
|
||||
@protocol Weapon
|
||||
-setOwner:(Entity)o;
|
||||
-fire;
|
||||
@end
|
||||
|
||||
#endif//__weapon_h
|
6
ruamoko/game/world.h
Normal file
6
ruamoko/game/world.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef __world_h
|
||||
#define __world_h
|
||||
|
||||
@extern integer deathmatch;
|
||||
|
||||
#endif//__world_h
|
74
ruamoko/game/world.r
Normal file
74
ruamoko/game/world.r
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include "gameent.h"
|
||||
#include "world.h"
|
||||
|
||||
id world;
|
||||
integer deathmatch;
|
||||
|
||||
void(entity e, vector min, vector max) setsize = #0;
|
||||
void(entity e, vector o) setorigin = #0;
|
||||
|
||||
|
||||
#define MAX_BODIES 8
|
||||
|
||||
@interface BodyQue : Object
|
||||
{
|
||||
entity [MAX_BODIES] bodies;
|
||||
integer head;
|
||||
}
|
||||
-init;
|
||||
-add:(GameEntity)ent;
|
||||
@end
|
||||
|
||||
@implementation BodyQue
|
||||
-init
|
||||
{
|
||||
local integer i;
|
||||
[super init];
|
||||
self.head = 0;
|
||||
for (i = 0; i < MAX_BODIES; i++)
|
||||
self.bodies[i] = [GameEntity new];
|
||||
}
|
||||
|
||||
-add:(GameEntity)ent
|
||||
{
|
||||
local entity be = bodies[head++];
|
||||
local entity e = [ent ent];
|
||||
be.angles = e.angles;
|
||||
be.model = e.model;
|
||||
be.modelindex = e.modelindex;
|
||||
be.frame = e.frame;
|
||||
be.colormap = e.colormap;
|
||||
be.movetype = e.movetype;
|
||||
be.velocity = e.velocity;
|
||||
be.flags = 0;
|
||||
setorigin (be, e.origin);
|
||||
setsize (be, e.mins, e.maxs);
|
||||
return self;
|
||||
}
|
||||
@end
|
||||
|
||||
@interface World : GameEntity
|
||||
{
|
||||
BodyQue bodyque;
|
||||
}
|
||||
-spawn:(entity)ent;
|
||||
-copyToBodyQue:(GameEntity)ent;
|
||||
@end
|
||||
|
||||
@implementation World
|
||||
-spawn:(entity)ent
|
||||
{
|
||||
[self initWithEntity:ent];
|
||||
id (bodyque) = [[BodyQue alloc] init];
|
||||
}
|
||||
|
||||
-copyToBodyQue:(GameEntity)ent
|
||||
{
|
||||
[bodyque add:ent];
|
||||
}
|
||||
@end
|
||||
|
||||
void () worldspawn =
|
||||
{
|
||||
world = [[World alloc] initWithEntity:@self];
|
||||
};
|
5
ruamoko/include/.gitignore
vendored
Normal file
5
ruamoko/include/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
*.d
|
||||
*.dat
|
||||
*.qfo
|
||||
*.sym
|
||||
.vimrc
|
19
ruamoko/include/entity.h
Normal file
19
ruamoko/include/entity.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef __rua_entity_h
|
||||
#define __rua_entity_h
|
||||
|
||||
#include "object.h"
|
||||
|
||||
@interface Entity : Object
|
||||
{
|
||||
entity ent;
|
||||
}
|
||||
|
||||
-init;
|
||||
-initWithEntity:(entity)e;
|
||||
-free;
|
||||
|
||||
-(entity)new;
|
||||
-(entity)ent;
|
||||
@end
|
||||
|
||||
#endif//__rua_entity_h
|
137
ruamoko/include/object.h
Normal file
137
ruamoko/include/object.h
Normal file
|
@ -0,0 +1,137 @@
|
|||
#ifndef __rua_object_h
|
||||
#define __rua_object_h
|
||||
|
||||
typedef enum {
|
||||
NO,
|
||||
YES,
|
||||
} BOOL;
|
||||
|
||||
@extern void (id object, integer code, string fmt, ...) obj_error;
|
||||
@extern void (id object, integer code, string fmt, ...) obj_verror;//FIXME not ...
|
||||
//obj_error_handler (objc_error_handler func) obj_set_error_handler = #0;
|
||||
@extern IMP (id receiver, SEL op) obj_msg_lookup;
|
||||
@extern IMP (id receiver, SEL op) obj_msg_lookup_super;
|
||||
//retval_t (id receiver, SEL op, arglist_t) obj_msg_sendv;
|
||||
@extern (void []) (integer size) obj_malloc;
|
||||
@extern (void []) (integer size) obj_atomic_malloc;
|
||||
@extern (void []) (integer size) obj_valloc;
|
||||
@extern (void []) (void [] mem, integer size) obj_realloc;
|
||||
@extern (void []) (integer nelem, integer size) obj_calloc;
|
||||
@extern void (void [] mem) obj_free;
|
||||
//(void []) (void) obj_get_uninstalled_dtable = #0;
|
||||
|
||||
@extern Class (string name) obj_get_class;
|
||||
@extern Class (string name) obj_lookup_class;
|
||||
//Class (void [][] enum_stage) obj_next_class = #0;
|
||||
|
||||
@extern string (SEL selector) sel_get_name;
|
||||
@extern string (SEL selector) sel_get_type;
|
||||
@extern SEL (string name) sel_get_uid;
|
||||
@extern SEL (string name) sel_get_any_uid;
|
||||
@extern SEL (string name) sel_get_any_typed_uid;
|
||||
@extern SEL (string name, string type) sel_get_typed_uid;
|
||||
@extern SEL (string name) sel_register_name;
|
||||
@extern SEL (string name, string type) sel_register_typed_name;
|
||||
@extern BOOL (SEL aSel) sel_is_mapped;
|
||||
|
||||
@extern Method (Class class, SEL aSel) class_get_class_method;
|
||||
@extern Method (Class class, SEL aSel) class_get_instance_method;
|
||||
@extern Class (Class imposter, Class superclass) class_pose_as;
|
||||
@extern id (Class class) class_create_instance;
|
||||
@extern string (Class class) class_get_class_name;
|
||||
@extern integer (Class class) class_get_instance_size;
|
||||
@extern Class (Class class) class_get_meta_class;
|
||||
@extern Class (Class class) class_get_super_class;
|
||||
@extern integer (Class class) class_get_version;
|
||||
@extern BOOL (Class class) class_is_class;
|
||||
@extern BOOL (Class class) class_is_meta_class;
|
||||
@extern void (Class class, integer version) class_set_version;
|
||||
@extern (void []) (Class class) class_get_gc_object_type;
|
||||
@extern void (Class class, string ivarname, BOOL gcInvisible) class_ivar_set_gcinvisible;
|
||||
|
||||
@extern IMP (Method method) method_get_imp;
|
||||
@extern IMP (Class class, SEL sel) get_imp;
|
||||
|
||||
@extern id (id object) object_copy;
|
||||
@extern id (id object) object_dispose;
|
||||
@extern Class (id object) object_get_class;
|
||||
@extern string (id object) object_get_class_name;
|
||||
@extern Class (id object) object_get_meta_class;
|
||||
@extern Class (id object) object_get_super_class;
|
||||
@extern BOOL (id object) object_is_class;
|
||||
@extern BOOL (id object) object_is_instance;
|
||||
@extern BOOL (id object) object_is_meta_class;
|
||||
|
||||
@interface Object
|
||||
{
|
||||
Class isa;
|
||||
}
|
||||
|
||||
+initialize;
|
||||
-init;
|
||||
|
||||
+new;
|
||||
+alloc;
|
||||
-free;
|
||||
-copy;
|
||||
-shallowCopy;
|
||||
-deepen;
|
||||
-deepCopy;
|
||||
|
||||
-(Class)class;
|
||||
-(Class)superClass;
|
||||
-(Class)metaClass;
|
||||
-(string)name;
|
||||
|
||||
-self;
|
||||
-(integer)hash;
|
||||
-(BOOL)isEqual:anObject;
|
||||
-(integer)compare:anotherObject;
|
||||
|
||||
-(BOOL)isMetaClass;
|
||||
-(BOOL)isClass;
|
||||
-(BOOL)isInstance;
|
||||
|
||||
-(BOOL)isKindOf:(Class)aClassObject;
|
||||
-(BOOL)isMemberOf:(Class)aClassObject;
|
||||
-(BOOL)isKindOfClassNamed:(string)aClassName;
|
||||
-(BOOL)isMemberOfClassNamed:(string)aClassName;
|
||||
|
||||
+(BOOL)instancesRespondTo:(SEL)aSel;
|
||||
-(BOOL)respondsTo:(SEL)aSel;
|
||||
|
||||
+(BOOL)conformsTo:(Protocol)aProtocol;
|
||||
-(BOOL)conformsTo:(Protocol)aProtocol;
|
||||
|
||||
+(IMP)instanceMethodFor:(SEL)aSel;
|
||||
-(IMP)methodFor:(SEL)aSel;
|
||||
//+(struct objc_method_description *)descriptionForInstanceMethod:(SEL)aSel;
|
||||
//-(struct objc_method_description *)descriptionForMethod:(SEL)aSel;
|
||||
|
||||
-perform:(SEL)aSel;
|
||||
-perform:(SEL)aSel with:anObject;
|
||||
-perform:(SEL)aSel with:anObject1 with:anObject2;
|
||||
|
||||
//-(retval_t)forward:(SEL)aSel :(arglist_t)argFrame;
|
||||
//-(retval_t)performv:(SEL)aSel :(arglist_t)argFrame;
|
||||
|
||||
+poseAs:(Class)aClassObject;
|
||||
-(Class)transmuteClassTo:(Class)aClassObject;
|
||||
|
||||
-subclassResponsibility:(SEL)aSel;
|
||||
-notImplemented:(SEL)aSel;
|
||||
-shouldNotImplement:(SEL)aSel;
|
||||
|
||||
-doesNotRecognize:(SEL)aSel;
|
||||
-error:(string)aString, ...;
|
||||
|
||||
//+(integer)version;
|
||||
//+setVersion:(integer)aVersion;
|
||||
//+(integer)streamVersion: (TypedStream*)aStream;
|
||||
|
||||
//-read: (TypedStream*)aStream;
|
||||
//-write: (TypedStream*)aStream;
|
||||
//-awake;
|
||||
@end
|
||||
|
||||
#endif//__rua_object_h
|
6
ruamoko/lib/.gitignore
vendored
Normal file
6
ruamoko/lib/.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
*.d
|
||||
*.dat
|
||||
*.pak
|
||||
*.qfo
|
||||
*.sym
|
||||
.vimrc
|
24
ruamoko/lib/Makefile
Normal file
24
ruamoko/lib/Makefile
Normal file
|
@ -0,0 +1,24 @@
|
|||
QFCC=qfcc
|
||||
QCFLAGS=-qq -g -Werror
|
||||
QCPPFLAGS=-I../include
|
||||
|
||||
libr_source = \
|
||||
entity.r \
|
||||
object.r
|
||||
|
||||
libr_obj = $(addsuffix .qfo,$(basename $(libr_source)))
|
||||
libr_dep = $(addsuffix .d,$(basename $(libr_source)))
|
||||
|
||||
%.qfo: %.r
|
||||
$(QFCC) $(QCFLAGS) $(QCPPFLAGS) -c -o $@ $<
|
||||
|
||||
%.qfo: %.qc
|
||||
$(QFCC) $(QCFLAGS) $(QCPPFLAGS) -c -o $@ $<
|
||||
|
||||
libr.pak: $(libr_obj)
|
||||
pak -cf $@ $^
|
||||
|
||||
clean:
|
||||
rm -f *.qfo *.pak *.d
|
||||
|
||||
-include $(libr_dep)
|
34
ruamoko/lib/entity.r
Normal file
34
ruamoko/lib/entity.r
Normal file
|
@ -0,0 +1,34 @@
|
|||
#include "entity.h"
|
||||
|
||||
entity () spawn = #0;
|
||||
void (entity e) remove = #0;
|
||||
|
||||
@implementation Entity
|
||||
-init
|
||||
{
|
||||
return [self initWithEntity:[self new]];
|
||||
}
|
||||
|
||||
-initWithEntity:(entity)e
|
||||
{
|
||||
self.ent = e;
|
||||
e.@this = self;
|
||||
return self;
|
||||
}
|
||||
|
||||
-free
|
||||
{
|
||||
remove (self.ent);
|
||||
return self;
|
||||
}
|
||||
|
||||
-new
|
||||
{
|
||||
return spawn ();
|
||||
}
|
||||
|
||||
-ent
|
||||
{
|
||||
return self.ent;
|
||||
}
|
||||
@end
|
309
ruamoko/lib/object.r
Normal file
309
ruamoko/lib/object.r
Normal file
|
@ -0,0 +1,309 @@
|
|||
#include "object.h"
|
||||
|
||||
void (obj_module_t [] msg) __obj_exec_class = #0;
|
||||
void (id object, integer code, string fmt, ...) obj_error = #0;
|
||||
void (id object, integer code, string fmt, ...) obj_verror = #0;//FIXME not ...
|
||||
//obj_error_handler (objc_error_handler func) obj_set_error_handler = #0;
|
||||
IMP (id receiver, SEL op) obj_msg_lookup = #0;
|
||||
IMP (id receiver, SEL op) obj_msg_lookup_super = #0;
|
||||
id (id receiver, SEL op, ...) obj_msgSend = #0;
|
||||
id (id receiver, SEL op, ...) obj_msgSend_super = #0;
|
||||
//retval_t (id receiver, SEL op, arglist_t) obj_msg_sendv = #0;
|
||||
(void []) (integer size) obj_malloc = #0;
|
||||
(void []) (integer size) obj_atomic_malloc = #0;
|
||||
(void []) (integer size) obj_valloc = #0;
|
||||
(void []) (void [] mem, integer size) obj_realloc = #0;
|
||||
(void []) (integer nelem, integer size) obj_calloc = #0;
|
||||
void (void [] mem) obj_free = #0;
|
||||
//(void []) (void) obj_get_uninstalled_dtable = #0;
|
||||
|
||||
Class (string name) obj_get_class = #0;
|
||||
Class (string name) obj_lookup_class = #0;
|
||||
//Class (void [][] enum_stage) obj_next_class = #0;
|
||||
|
||||
string (SEL selector) sel_get_name = #0;
|
||||
string (SEL selector) sel_get_type = #0;
|
||||
SEL (string name) sel_get_uid = #0;
|
||||
SEL (string name) sel_get_any_uid = #0;
|
||||
SEL (string name) sel_get_any_typed_uid = #0;
|
||||
SEL (string name, string type) sel_get_typed_uid = #0;
|
||||
SEL (string name) sel_register_name = #0;
|
||||
SEL (string name, string type) sel_register_typed_name = #0;
|
||||
BOOL (SEL aSel) sel_is_mapped = #0;
|
||||
|
||||
Method (Class class, SEL aSel) class_get_class_method = #0;
|
||||
Method (Class class, SEL aSel) class_get_instance_method = #0;
|
||||
Class (Class imposter, Class superclass) class_pose_as = #0;
|
||||
id (Class class) class_create_instance = #0;
|
||||
string (Class class) class_get_class_name = #0;
|
||||
integer (Class class) class_get_instance_size = #0;
|
||||
Class (Class class) class_get_meta_class = #0;
|
||||
Class (Class class) class_get_super_class = #0;
|
||||
integer (Class class) class_get_version = #0;
|
||||
BOOL (Class class) class_is_class = #0;
|
||||
BOOL (Class class) class_is_meta_class = #0;
|
||||
void (Class class, integer version) class_set_version = #0;
|
||||
(void []) (Class class) class_get_gc_object_type = #0;
|
||||
void (Class class, string ivarname, BOOL gcInvisible) class_ivar_set_gcinvisible = #0;
|
||||
|
||||
IMP (Method method) method_get_imp = #0;
|
||||
IMP (Class class, SEL sel) get_imp = #0;
|
||||
|
||||
id (id object) object_copy = #0;
|
||||
id (id object) object_dispose = #0;
|
||||
Class (id object) object_get_class = #0;
|
||||
string (id object) object_get_class_name = #0;
|
||||
Class (id object) object_get_meta_class = #0;
|
||||
Class (id object) object_get_super_class = #0;
|
||||
BOOL (id object) object_is_class = #0;
|
||||
BOOL (id object) object_is_instance = #0;
|
||||
BOOL (id object) object_is_meta_class = #0;
|
||||
|
||||
@implementation Object
|
||||
+initialize
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
-init
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
+new
|
||||
{
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
+alloc
|
||||
{
|
||||
return class_create_instance (self);
|
||||
}
|
||||
|
||||
-free
|
||||
{
|
||||
return object_dispose (self);
|
||||
}
|
||||
|
||||
-copy
|
||||
{
|
||||
return [[self shallowCopy] deepen];
|
||||
}
|
||||
|
||||
-shallowCopy
|
||||
{
|
||||
return object_copy (self);
|
||||
}
|
||||
|
||||
-deepen
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
-deepCopy
|
||||
{
|
||||
return [self copy];
|
||||
}
|
||||
|
||||
-(Class)class
|
||||
{
|
||||
return object_get_class (self);
|
||||
}
|
||||
|
||||
-(Class)superClass
|
||||
{
|
||||
return object_get_super_class (self);
|
||||
}
|
||||
|
||||
-(Class)metaClass
|
||||
{
|
||||
return object_get_meta_class (self);
|
||||
}
|
||||
|
||||
-(string)name
|
||||
{
|
||||
return object_get_class_name (self);
|
||||
}
|
||||
|
||||
-self
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
-(integer)hash = #0; // can't cast pointer to integer
|
||||
|
||||
-(BOOL)isEqual:anObject
|
||||
{
|
||||
return self == anObject;
|
||||
}
|
||||
|
||||
-(integer)compare:anotherObject = #0; // can only == or != pointers
|
||||
|
||||
-(BOOL)isMetaClass
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
-(BOOL)isClass
|
||||
{
|
||||
return object_is_class (self);
|
||||
}
|
||||
|
||||
-(BOOL)isInstance
|
||||
{
|
||||
return object_is_instance (self);
|
||||
}
|
||||
|
||||
-(BOOL)isKindOf:(Class)aClassObject
|
||||
{
|
||||
local Class class;
|
||||
|
||||
for (class = self.isa; class; class = class_get_super_class (class))
|
||||
if (class == aClassObject)
|
||||
return YES;
|
||||
return NO;
|
||||
}
|
||||
|
||||
-(BOOL)isMemberOf:(Class)aClassObject
|
||||
{
|
||||
return self.isa == aClassObject;
|
||||
}
|
||||
|
||||
-(BOOL)isKindOfClassNamed:(string)aClassName
|
||||
{
|
||||
local Class class;
|
||||
if (aClassName)
|
||||
for (class = self.isa; class; class = class_get_super_class (class))
|
||||
if (class_get_class_name (class) == aClassName)
|
||||
return YES;
|
||||
return NO;
|
||||
}
|
||||
|
||||
-(BOOL)isMemberOfClassNamed:(string)aClassName
|
||||
{
|
||||
local Class class;
|
||||
if (aClassName)
|
||||
for (class = self.isa; class; class = class_get_super_class (class))
|
||||
if (class_get_class_name (class) == aClassName)
|
||||
return YES;
|
||||
return aClassName && class_get_class_name (self.isa) == aClassName;
|
||||
}
|
||||
|
||||
+(BOOL)instancesRespondTo:(SEL)aSel
|
||||
{
|
||||
return class_get_instance_method (self, aSel) != NIL;
|
||||
}
|
||||
|
||||
-(BOOL)respondsTo:(SEL)aSel
|
||||
{
|
||||
return (object_is_instance (self)
|
||||
? class_get_instance_method (self.isa, aSel)
|
||||
: class_get_class_method (self.isa, aSel)) != NIL;
|
||||
}
|
||||
|
||||
+(BOOL)conformsTo:(Protocol)aProtocol = #0;
|
||||
-(BOOL)conformsTo:(Protocol)aProtocol
|
||||
{
|
||||
return [[self class] conformsTo:aProtocol];
|
||||
}
|
||||
|
||||
+(IMP)instanceMethodFor:(SEL)aSel
|
||||
{
|
||||
return method_get_imp (class_get_instance_method (self, aSel));
|
||||
}
|
||||
|
||||
-(IMP)methodFor:(SEL)aSel
|
||||
{
|
||||
return method_get_imp (object_is_instance (self)
|
||||
? class_get_instance_method (self.isa, aSel)
|
||||
: class_get_class_method (self.isa, aSel));
|
||||
}
|
||||
|
||||
//+(struct objc_method_description *)descriptionForInstanceMethod:(SEL)aSel = #0;
|
||||
//-(struct objc_method_description *)descriptionForMethod:(SEL)aSel = #0;
|
||||
|
||||
-perform:(SEL)aSel
|
||||
{
|
||||
local IMP msg = obj_msg_lookup (self, aSel);
|
||||
|
||||
if (!msg)
|
||||
return [self error:"invalid selector passed to %s",
|
||||
sel_get_name (_cmd)];
|
||||
return msg (self, aSel);
|
||||
}
|
||||
|
||||
-perform:(SEL)aSel with:anObject
|
||||
{
|
||||
local IMP msg = obj_msg_lookup (self, aSel);
|
||||
|
||||
if (!msg)
|
||||
return [self error:"invalid selector passed to %s",
|
||||
sel_get_name (_cmd)];
|
||||
return msg (self, aSel, anObject);
|
||||
}
|
||||
|
||||
-perform:(SEL)aSel with:anObject1 with:anObject2
|
||||
{
|
||||
local IMP msg = obj_msg_lookup (self, aSel);
|
||||
|
||||
if (!msg)
|
||||
return [self error:"invalid selector passed to %s",
|
||||
sel_get_name (_cmd)];
|
||||
return msg (self, aSel, anObject1, anObject2);
|
||||
}
|
||||
|
||||
//-(retval_t)forward:(SEL)aSel :(arglist_t)argFrame = #0;
|
||||
//-(retval_t)performv:(SEL)aSel :(arglist_t)argFrame = #0;
|
||||
|
||||
+poseAs:(Class)aClassObject
|
||||
{
|
||||
return class_pose_as (self, aClassObject);
|
||||
}
|
||||
|
||||
-(Class)transmuteClassTo:(Class)aClassObject
|
||||
{
|
||||
if (object_is_instance (self))
|
||||
if (class_is_class (aClassObject))
|
||||
if (class_get_instance_size (aClassObject) == class_get_instance_size (isa))
|
||||
if ([self isKindOf:aClassObject]) {
|
||||
local Class old_isa = isa;
|
||||
isa = aClassObject;
|
||||
return old_isa;
|
||||
}
|
||||
return NIL;
|
||||
}
|
||||
|
||||
-subclassResponsibility:(SEL)aSel
|
||||
{
|
||||
return [self error:"subclass should override %s",
|
||||
sel_get_name(aSel)];
|
||||
}
|
||||
|
||||
-notImplemented:(SEL)aSel
|
||||
{
|
||||
return [self error:"methos %s not implemented",
|
||||
sel_get_name(aSel)];
|
||||
}
|
||||
|
||||
-shouldNotImplement:(SEL)aSel
|
||||
{
|
||||
return [self error:"%s should not implement %s",
|
||||
object_get_class_name (self), sel_get_name(aSel)];
|
||||
}
|
||||
|
||||
-doesNotRecognize:(SEL)aSel
|
||||
{
|
||||
return [self error:"%s does not recognize %s",
|
||||
object_get_class_name (self), sel_get_name(aSel)];
|
||||
}
|
||||
|
||||
-error:(string)aString, ... = #0;
|
||||
|
||||
//+(integer)version = #0;
|
||||
//+setVersion:(integer)aVersion = #0;
|
||||
//+(integer)streamVersion: (TypedStream*)aStream = #0;
|
||||
|
||||
//-read: (TypedStream*)aStream = #0;
|
||||
//-write: (TypedStream*)aStream = #0;
|
||||
//-awake = #0;
|
||||
@end
|
Loading…
Reference in a new issue