/* ASwarm II V2.0 - The Original One Written by Markus "Ill" Illenseer markus@Techfak.Uni-Bielefeld.de and Matthias "Tron" Scheler tron@uni-paderborn.de Based upon Jeff Buterworths XSwarm. Now released as MUI Application. Please leave this source intact. ASwarm is freely distributable, but no longer 'Public Domain'. If you have suggestions or Bug-Reports, please contact us. Read the Manuals for known Bugs and Contact-Adresses. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __SASC /* some stuff for SAS-C */ #include #include #include #include #include #include #include #define VOID_GETA4 void __interrupt __saveds #define REGARGS(rv) rv __regargs #define CHIP(dt) dt __chip #define ASM(rv) rv __saveds __asm #define REG(r) register __ ## r CxObj *HotKey(UBYTE *,struct MsgPort *,long); void NewList(struct List *); UBYTE *Version = "$VER: ASwarm II 2.0 (compiled with SAS/C)"; /* Attention ! ASwarmII ... */ void chkabort(void) {} #else /* some stuff for Dice */ #define VOID_GETA4 __stkargs __geta4 void #define REGARGS(rv) __regargs rv #define CHIP(dt) __chip dt #define ASM(rv) __geta4 rv #define REG(r) __ ## r UBYTE *Version = "$VER: ASwarm II 2.0 (compiled with DICE)"; /* Attention ! ASwarmII ... */ void main(LONG,UBYTE **); void wbmain(struct WBStartup *WBS) { if (WBS->sm_NumArgs) (void)CurrentDir(WBS->sm_ArgList->wa_Lock); main(0L,(UBYTE **)WBS); } #endif /* Common Definitions */ #define custom (*((struct Custom *)0xDFF000L)) /* Hardwarebangers :-) */ #define ciaa (*((struct CIA *)0xBFE001L)) extern struct ExecBase *SysBase; extern struct DosLibrary *DOSBase; #define FINDPROCPORT (&((struct Process *)SysBase->ThisTask)->pr_MsgPort) struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Library *CxBase,*MUIMasterBase,*IconBase; LONG WBStarted; #define NUMTOOLTYPES 17 char *ToolTypeIDs[NUMTOOLTYPES] = {"CX_PRIORITY","CX_POPUP","CX_POPKEY","BLANKKEY", "TIMEOUT","CLIENTTIMEOUT", "DISPLAY","CYCLE","AIM", "WASP","BEES","SPEED","TIGHTNESS", "MOUSEBLANKMETHOD","VELOCITY","JOYSTICK","FINALTIMEOUT"}; /* MUI stuff */ /* Defines for the Guide-Node-entries */ #define GUIDE_FILE "ASwarm.guide" #define NODE_MAIN_MAIN "EDIT" #define NODE_MAIN_HIDE "HIDE" #define NODE_MAIN_BLANK "BLANK" #define NODE_MAIN_QUIT "QUIT" #define NODE_COMM_MAIN "COMM" #define NODE_COMM_TIMEOUT "TIME" #define NODE_COMM_POPKEY "POPKEY" #define NODE_COMM_CLTIME "CLIENT" #define NODE_COMM_BLANKKEY "BLANKKEY" #define NODE_COMM_FITIME "FINAL" #define NODE_COMM_JOYSTICK "JOYSTICK" #define NODE_SWARM_MAIN "OPTIONS" #define NODE_SWARM_SPEED "SPEED" #define NODE_SWARM_WASPS "WASPS" #define NODE_SWARM_BEES "BEES" #define NODE_SWARM_VELO "VELO" #define NODE_SWARM_TIGHT "TIGHT" #define NODE_SWARM_COLOR "COLOR" #define NODE_SWARM_AIM "AIM" #define NODE_DISPLAY_MAIN "DISPLAY" #define NODE_DISPLAY_LIST "SCREEN" #define NODE_DISPLAY_MOUSE "MOUSE" APTR AP_ASwarm,WI_Config; APTR ST_Time,ST_Pop,ST_Client,ST_Blank,ST_Final; APTR CY_Speed,CY_Mouse; APTR SL_Wasps,SL_Bees,SL_Velo,SL_Tight; APTR CM_Cycle,CM_Aim,CM_JoyStick; APTR LV_Modes; #define ID_OPEN_WINDOW 1L #define ID_CLOSE_WINDOW 2L #define ID_BLANK 3L #define ID_TIMEOUT 10L #define ID_POPKEY 11L #define ID_CLIENTTIMEOUT 12L #define ID_BLANKKEY 13L #define ID_FINALTIMEOUT 14L #define ID_JOYSTICK 15L #define ID_SPEED 20L #define ID_MOUSE 21L #define ID_WASPS 22L #define ID_BEES 23L #define ID_VELOCITY 24L #define ID_TIGHTNESS 25L #define ID_CYCLE 26L #define ID_AIM 27L #define ID_MODES 30L #define ID_LOAD_CONFIG 40L #define ID_SAVE_CONFIG 41L #define ID_ABOUT 42L #define ID_DEFAULTS 43L char *CE_Speed[5],*CE_SpeedPreDef[] = { "Slow Motion","Very Slow","Slow", "Normal","Fast","Very Fast","Incredible" }; char *CE_MouseBlank[] = {"Hardware","Window",NULL}; struct NewMenu NM_Config[] = {NM_TITLE,"Project",NULL,0,0L,NULL, NM_ITEM,"Load Config","L",0,0L,(APTR)ID_LOAD_CONFIG, NM_ITEM,"Save Config","S",0,0L,(APTR)ID_SAVE_CONFIG, NM_ITEM,NM_BARLABEL,NULL,0,0L,NULL, NM_ITEM,"About ...",NULL,0,0L,(APTR)ID_ABOUT, NM_ITEM,NM_BARLABEL,NULL,0,0L,NULL, NM_ITEM,"Hide","H",0,0L,(APTR)ID_CLOSE_WINDOW, NM_ITEM,"Quit","Q",0,0L,(APTR)MUIV_Application_ReturnID_Quit, NM_TITLE,"Edit",NULL,0,0L,NULL, NM_ITEM,"Reset To Defaults","D",0,0L,(APTR)ID_DEFAULTS, NM_END,NULL,NULL,0,0L,NULL}; /* Definitions for our Commodity */ CxObj *Broker,*PopKeyFilter,*BlankKeyFilter; struct MsgPort *CxPort; LONG CxPri,CxPopUp; UBYTE PopKey[128],BlankKey[128]; LONG JoyStick; #define EVENT_OPEN_WINDOW 4711L /* What is that number for, Tron ? */ #define EVENT_BLANK 4712L #define DEF_CX_PRI 0L #define DEF_POPKEY "CONTROL ALT s" /* Hot Key for the Edit Window */ #define DEF_BLANKKEY "CONTROL ALT b" /* Hot Key for immediate Blank */ LONG TimeLeft,InitTimeLeft,TimeOut,ClientTimeOut,FinalTimeOut; #define MAX_TIMEOUT 3600L #define MAX_CLIENT_TIMEOUT 60L #define MAX_FINAL_TIMEOUT 3600L #define DEF_TIMEOUT 60L #define DEF_CLIENT_TIMEOUT 5L #define DEF_FINAL_TIMEOUT 0L #define SERVER_PRI 5L /* Don't change this, saves live */ #define CLIENT_PRI -40L /* Definitions for our Blanker Screen */ CHIP(UWORD) EmptyPointer[] = {0,0,0,0}; /* Dummy Pointer when using the One-Pixel-Window-Trick */ struct ModeNode { struct Node mn_Node; UWORD mn_Index; ULONG mn_DisplayID; char mn_Name[DISPLAYNAMELEN]; }; struct List *ModeList; struct ModeNode *DisplayMode; #define FindMode(l,n) ((struct ModeNode *)FindName(l,n)) #define DEF_MODE HIRES #define DEF_MODE_NAME "HighRes" /* Mini and Maximum definitions for possible parameters */ #define MAX_SPEED 4L #define MAX_WASPS 10L #define MAX_BEES 500L #define MAX_TIGHTNESS 10L #define MAX_VEL 15L #define DEF_SPEED 4L #define DEF_WASPS 2L #define DEF_BEES 25L #define DEF_TIGHTNESS 5L #define DEF_VEL 5L char *Template = /* extra extra extra long :-) */ "CX_PRIORITY/N/K,CX_POPKEY/K,CX_POPUP/S,BLANKKEY/K,SECONDS=TIMEOUT/N/K," "CLIENTTIMEOUT/N/K,DISPLAY/K,CYCLE/S,AIM/S,WASPS/N/K,BEES/N/K,SPEED/N/K," "TIGHTNESS/N/K,MOUSEBLANKMETHOD/K,VELOCITY/N/K,JOYSTICK/S,FINALTIMEOUT/N/K"; /* Definitions for Server/Client Communication */ BYTE bsp_TimeOut,bsp_InputSig,bsp_ClientSig; struct Task *BlankerServerProcess; #define MASK(n) (1L<<(n)) struct BlankerClientMsg { struct Message bcm_Message; struct Screen *bcm_Screen; LONG bcm_Status; ULONG bcm_SigMask; LONG bcm_Wasps,bcm_Bees,bcm_Speed,bcm_Tightness,bcm_Velocity; LONG bcm_Cycle,bcm_AimMode,bcm_MouseBlank,bcm_FinalTimeOut; } BlankerClientMsg; /* Definitions or Swarm Movement */ #define BEEACC 3 #define BEEVELOC 2 #define WASPACC 5 #define WASPVELOC 5 #define BORDER 20 #define WASPVEL (WASPVELOC+Velocity) #define BEEVEL (BEEVELOC+Velocity) #define BEE_PEN 1 #define WASP_PEN 2 #define BEE_COL_NUM 33 UWORD BeeColors[BEE_COL_NUM] = /* Color Cycling Table */ {0x000F,0x000F,0x004F,0x008F,0x00BF,0x00FF,0x00FB,0x00F7,0x00F3,0x00F0,0x04F0, 0x08F0,0x09F0,0x0AF0,0x0BF0,0x0CF0,0x0DF0,0x0EF0,0x0FF0,0x0FE0,0x0FD0,0x0FC0, 0x0FB0,0x0F90,0x0F80,0x0F70,0x0F60,0x0F50,0x0F40,0x0F30,0x0F20,0x0F10,0x0F00}; #define RAND(m) (Random(m)-(m)/2) LONG RandN,RandF,RandI; UWORD SwarmColors[4] = {0x0000,0x0000,0x0FFF,0x0000}; LONG NumWasps,NumBees,Speed,Tightness; LONG Cycle,AimMode,MouseBlank,Velocity; struct SwarmStruct /* structure for a swarm, including the wasp */ { WORD ss_Width; /* Width and */ WORD ss_Height; /* Height of the used Screen, probably useful for future versions of ASwarm :) */ WORD ss_NumWasps;/* total number of the Wasps */ WORD *ss_WX[4]; /* The Wasps x-Position*/ /* WX[3] is used for Velocity */ WORD *ss_WY[4]; /* Y-Position */ WORD *ss_NB; /* No. of Bees following this Wasp */ WORD ss_NumBees; /* Total (!) number of Bees */ WORD ss_BeeAcc; /* Acceleration of the Bees */ WORD *ss_X[4]; /* The Bees X-Position */ /* X[3] used for Velocity */ WORD *ss_Y[4]; /* Y-Position */ WORD *ss_MW; /* The aimed Wasp */ }; /* Ill's strange Macros for easy access to the above structure */ #define BXVel(I) (SP->ss_X[3][I]) #define BYVel(I) (SP->ss_Y[3][I]) #define BeeX(P,I) (SP->ss_X[P][I]) #define BeeY(P,I) (SP->ss_Y[P][I]) #define MyWasp(I) (SP->ss_MW[I]) #define WaXVel(I) (SP->ss_WX[3][I]) #define WaYVel(I) (SP->ss_WY[3][I]) #define WaspX(P,I) (SP->ss_WX[P][I]) #define WaspY(P,I) (SP->ss_WY[P][I]) /* The following functions are taken from my resource tracker library for SAS/C. I normally use to link the programs with this library, but to make it possible for other people to compile ASwarm II I included the required source codes. - Tron - */ struct ToolNode { struct ToolNode *Next; void *Tool; void (*RemProc)(void *,LONG); /* requires stack arguments !!! */ LONG Size; } *ToolList; REGARGS(void) RemTool(void *Tool) { struct ToolNode **Ptr,*ToolNode; Ptr=&ToolList; while (ToolNode=*Ptr) if (ToolNode->Tool==Tool) { *Ptr=ToolNode->Next; ToolNode->RemProc(ToolNode->Tool,ToolNode->Size); FreeVec (ToolNode); return; /* This one was missing in ASwarm II V1.0-V1.1 and in ASwarm III :-) */ } else Ptr=&ToolNode->Next; } void RemoveAll(void) { while (ToolList) RemTool (ToolList->Tool); } REGARGS(void) AddTool(void *NewTool,void *ProcPtr,LONG NewSize) { struct ToolNode *Ptr; void (*NewRemProc)(void *,LONG); static BOOL First=TRUE; NewRemProc=(void (*)(void *,LONG))ProcPtr; if (NewTool==NULL) exit (10); if (First) { First=FALSE; if (atexit(RemoveAll)) { NewRemProc (NewTool,NewSize); exit (20); } } if ((Ptr=AllocVec(sizeof(struct ToolNode),0L))==NULL) { NewRemProc (NewTool,NewSize); exit (20); } Ptr->Next=ToolList; Ptr->Tool=NewTool; Ptr->RemProc=NewRemProc; Ptr->Size=NewSize; ToolList=Ptr; } /* Some useful functions */ void MUI_Dispose(APTR Object) { MUI_DisposeObject (Object); } void MUI_DisplayBeep(APTR WI_Any) { struct Window *Window; Window=NULL; get (WI_Any,MUIA_Window_Window,&Window); if (Window) DisplayBeep (Window->WScreen); } void DeleteMsgPortSafely(struct MsgPort *AnyPort) { struct Message *AnyMsg; while (AnyMsg=GetMsg(AnyPort)) ReplyMsg (AnyMsg); DeleteMsgPort (AnyPort); } LONG RDArgsLong(LONG Param,LONG Default,LONG Min,LONG Max) { LONG *Ptr; if ((Ptr=(LONG *)Param)==NULL) return Default; if ((*PtrMax)) return Default; else return *Ptr; } UWORD PutChar[2] = {0x16C0,0x4E75}; /* dirty hack to avoid assembler part :-) 16C0: move.b d0,(a3)+ 4E75: rts */ void SPrintF(char *Buffer,char *FormatString,...) { RawDoFmt (FormatString,(APTR)((LONG *)&FormatString+1L), (void *)PutChar,Buffer); } /* Functions for Handling the List of the avaible Graphics Modes */ void DeleteModeList(struct List *ModeList) { struct ModeNode *ModeNode; while (ModeNode=(struct ModeNode *)RemHead(ModeList)) FreeVec (ModeNode); FreeVec (ModeList); } struct List *CreateModeList(void) { struct List *ModeList; UWORD Num; ULONG DisplayID; struct DimensionInfo DimInfo; struct NameInfo NameInfo; struct ModeNode *ModeNode; if (ModeList=AllocVec(sizeof(struct List),MEMF_PUBLIC)) NewList (ModeList); else return NULL; Num=0; DisplayID=INVALID_ID; while ((DisplayID=NextDisplayInfo(DisplayID))!=INVALID_ID) if ((DisplayID&MONITOR_ID_MASK)&&(ModeNotAvailable(DisplayID)==0L)) if (GetDisplayInfoData(NULL,(UBYTE *)&DimInfo,sizeof(struct DimensionInfo), DTAG_DIMS,DisplayID)) if (DimInfo.MaxDepth>1) if (GetDisplayInfoData(NULL,(UBYTE *)&NameInfo,sizeof(struct NameInfo), DTAG_NAME,DisplayID)) if (ModeNode=AllocVec(sizeof(struct ModeNode),MEMF_PUBLIC)) { (void)strcpy(ModeNode->mn_Node.ln_Name=ModeNode->mn_Name, NameInfo.Name); ModeNode->mn_Index=Num++; ModeNode->mn_DisplayID=DisplayID; AddTail (ModeList,&ModeNode->mn_Node); } if (ModeList->lh_Head->ln_Succ==NULL) if (ModeNode=AllocVec(sizeof(struct ModeNode),MEMF_PUBLIC)) { (void)strcpy(ModeNode->mn_Node.ln_Name=ModeNode->mn_Name,DEF_MODE_NAME); ModeNode->mn_Index=Num; ModeNode->mn_DisplayID=DEF_MODE; AddTail (ModeList,&ModeNode->mn_Node); } else { FreeVec (ModeList); return NULL; } return ModeList; } REGARGS(struct ModeNode *) GetDefaultMode(struct List *ModeList) { struct NameInfo NameInfo; struct ModeNode *ModeNode; if (GetDisplayInfoData(NULL,(UBYTE *)&NameInfo,sizeof(struct NameInfo), DTAG_NAME,DEF_MODE)) if (ModeNode=FindMode(ModeList,NameInfo.Name)) return ModeNode; return (struct ModeNode *)ModeList->lh_Head; } REGARGS(struct ModeNode *) GetIndexMode(struct List *ModeList,UWORD Index) { struct ModeNode *ModeNode; ModeNode=(struct ModeNode *)ModeList->lh_Head; while (ModeNode->mn_Node.ln_Succ) if (ModeNode->mn_Index==Index) return ModeNode; else ModeNode=(struct ModeNode *)ModeNode->mn_Node.ln_Succ; return (struct ModeNode *)ModeList->lh_Head; } /* "icon.library" Stuff */ REGARGS(char *) YesNo(LONG Flag) { return Flag?"YES":"NO"; } REGARGS(char *) ToolTypeString(struct DiskObject *DiskObject,char *ID, char *Default) { char *String; if (DiskObject==NULL) return Default; if (String=FindToolType(DiskObject->do_ToolTypes,ID)) return String; else return Default; } REGARGS(LONG) ToolTypeBoolean(struct DiskObject *DiskObject,char *ID, LONG Default) { if (Default) return (stricmp(ToolTypeString(DiskObject,ID,""), YesNo(FALSE))!=0); else return (stricmp(ToolTypeString(DiskObject,ID,""),YesNo(TRUE))==0); } /* should be: REGARGS(LONG) ... but DICE 2.07.54 doesn't like that. */ LONG ToolTypeLong(struct DiskObject *DiskObject,char *ID,LONG Default, LONG Min,LONG Max) { char *String; if (DiskObject==NULL) return Default; if (String=FindToolType(DiskObject->do_ToolTypes,ID)) { LONG Value; Value=atol(String); if ((ValueMax)) return Default; else return Value; } else return Default; } REGARGS(void) LoadConfig(char *Name) { struct DiskObject *DiskObject; if (Name) DiskObject=GetDiskObject(Name); else DiskObject=NULL; CxPri=ToolTypeLong(DiskObject,ToolTypeIDs[0],0L,-128L,127L); CxPopUp=ToolTypeBoolean(DiskObject,ToolTypeIDs[1],TRUE); (void)strcpy(PopKey,ToolTypeString(DiskObject,ToolTypeIDs[2],DEF_POPKEY)); (void)strcpy(BlankKey,ToolTypeString(DiskObject,ToolTypeIDs[3],DEF_BLANKKEY)); /* get Time Out, Client Time Out and Display mode */ if ((TimeOut=ToolTypeLong(DiskObject,"SECONDS",0L,1L,MAX_TIMEOUT))==0L) TimeOut=ToolTypeLong(DiskObject,ToolTypeIDs[4],DEF_TIMEOUT,1L,MAX_TIMEOUT); ClientTimeOut=ToolTypeLong(DiskObject,ToolTypeIDs[5], DEF_CLIENT_TIMEOUT,1L,MAX_CLIENT_TIMEOUT); FinalTimeOut=ToolTypeLong(DiskObject,ToolTypeIDs[16], DEF_FINAL_TIMEOUT,1L,MAX_FINAL_TIMEOUT); if ((DisplayMode=FindMode(ModeList,ToolTypeString(DiskObject,ToolTypeIDs[6], "")))==NULL) DisplayMode=GetDefaultMode(ModeList); /* get Parameters for Graphics */ Speed=ToolTypeLong(DiskObject,ToolTypeIDs[11],DEF_SPEED,1L,MAX_SPEED); if (stricmp(ToolTypeString(DiskObject,ToolTypeIDs[13],""), CE_MouseBlank[1])) MouseBlank=0L; else MouseBlank=1L; NumWasps=ToolTypeLong(DiskObject,ToolTypeIDs[9],DEF_WASPS,1L,MAX_WASPS); NumBees=ToolTypeLong(DiskObject,ToolTypeIDs[10],DEF_BEES,1L,MAX_BEES); Tightness=ToolTypeLong(DiskObject,ToolTypeIDs[12],DEF_TIGHTNESS,1L, MAX_TIGHTNESS); Velocity=ToolTypeLong(DiskObject,ToolTypeIDs[14],DEF_VEL,1L,MAX_VEL); Cycle=ToolTypeBoolean(DiskObject,ToolTypeIDs[7],FALSE); AimMode=ToolTypeBoolean(DiskObject,ToolTypeIDs[8],FALSE); JoyStick=ToolTypeBoolean(DiskObject,ToolTypeIDs[15],FALSE); if (WI_Config) { set (ST_Time,MUIA_String_Integer,TimeOut); set (ST_Pop,MUIA_String_Contents,PopKey); set (ST_Client,MUIA_String_Integer,ClientTimeOut); set (ST_Blank,MUIA_String_Contents,BlankKey); set (ST_Final,MUIA_String_Integer,FinalTimeOut); set (LV_Modes,MUIA_List_Active,DisplayMode->mn_Index); set (CY_Speed,MUIA_Cycle_Active,Speed-1L); set (CY_Mouse,MUIA_Cycle_Active,MouseBlank); set (SL_Wasps,MUIA_Slider_Level,NumWasps); set (SL_Bees,MUIA_Slider_Level,NumBees); set (SL_Tight,MUIA_Slider_Level,Tightness); set (SL_Velo,MUIA_Slider_Level,Velocity); set (CM_Cycle,MUIA_Selected,Cycle); set (CM_Aim,MUIA_Selected,AimMode); set (CM_JoyStick,MUIA_Selected,JoyStick); } if (DiskObject) FreeDiskObject (DiskObject); } REGARGS(void) SaveConfig(char *Name) { struct DiskObject *DiskObject; ULONG Index; char **NewToolTypes,**NextEntry,**OldToolTypes; if ((DiskObject=GetDiskObjectNew(Name))==NULL) { MUI_DisplayBeep (WI_Config); return; } Index=0L; OldToolTypes=DiskObject->do_ToolTypes; while (OldToolTypes[Index]) Index++; Index+=NUMTOOLTYPES+1L; if ((NewToolTypes=(char **)AllocVec(Index*4L+NUMTOOLTYPES*48L, MEMF_PUBLIC|MEMF_CLEAR))==NULL) { FreeDiskObject (DiskObject); return; } NextEntry=NewToolTypes; SPrintF (*NextEntry++=(char *)&NewToolTypes[Index],"%s=%ld",ToolTypeIDs[0],CxPri); SPrintF (*NextEntry++=NewToolTypes[0]+48L,"%s=NO",ToolTypeIDs[1]); SPrintF (*NextEntry++=NewToolTypes[1]+48L,"%s=%s",ToolTypeIDs[2],PopKey); SPrintF (*NextEntry++=NewToolTypes[2]+48L,"%s=%s",ToolTypeIDs[3],BlankKey); SPrintF (*NextEntry++=NewToolTypes[3]+48L,"%s=%ld",ToolTypeIDs[4],TimeOut); SPrintF (*NextEntry++=NewToolTypes[4]+48L,"%s=%ld",ToolTypeIDs[5], ClientTimeOut); SPrintF (*NextEntry++=NewToolTypes[5]+48L,"%s=%s",ToolTypeIDs[6], DisplayMode->mn_Name); SPrintF (*NextEntry++=NewToolTypes[6]+48L,"%s=%s",ToolTypeIDs[7], YesNo(Cycle)); SPrintF (*NextEntry++=NewToolTypes[7]+48L,"%s=%s",ToolTypeIDs[8], YesNo(AimMode)); SPrintF (*NextEntry++=NewToolTypes[8]+48L,"%s=%ld",ToolTypeIDs[9],NumWasps); SPrintF (*NextEntry++=NewToolTypes[9]+48L,"%s=%ld",ToolTypeIDs[10],NumBees); SPrintF (*NextEntry++=NewToolTypes[10]+48L,"%s=%ld",ToolTypeIDs[11],Speed); SPrintF (*NextEntry++=NewToolTypes[11]+48L,"%s=%ld",ToolTypeIDs[12],Tightness); SPrintF (*NextEntry++=NewToolTypes[12]+48L,"%s=%s",ToolTypeIDs[13], CE_MouseBlank[MouseBlank]); SPrintF (*NextEntry++=NewToolTypes[13]+48L,"%s=%ld",ToolTypeIDs[14],Velocity); SPrintF (*NextEntry++=NewToolTypes[14]+48L,"%s=%s",ToolTypeIDs[15],YesNo(JoyStick)); SPrintF (*NextEntry++=NewToolTypes[15]+48L,"%s=%ld",ToolTypeIDs[16],FinalTimeOut); Index=0L; while (OldToolTypes[Index]) { char *Ptr,*Asgn; if (Ptr=(char *)AllocVec(strlen(OldToolTypes[Index])+1L,0L)) { if (Asgn=strchr(strcpy(Ptr,OldToolTypes[Index]),'=')) *Asgn='\0'; if (FindToolType(NewToolTypes,Ptr)==NULL) *NextEntry++=OldToolTypes[Index]; FreeVec (Ptr); } Index++; } DiskObject->do_ToolTypes=NewToolTypes; if (!PutDiskObject(Name,DiskObject)) MUI_DisplayBeep (WI_Config); (void)PutDiskObject(Name,DiskObject); DiskObject->do_ToolTypes=OldToolTypes; FreeVec (NewToolTypes); FreeDiskObject (DiskObject); } /* Our "InputHandler" */ #define BIT(w,b) (((w)>>(b))&1) VOID_GETA4 BlankerAction(CxMsg *CxMsg,CxObj *CO) { struct InputEvent *IE; if (JoyStick) if (BIT(custom.joy1dat,1)||(BIT(custom.joy1dat,1)^BIT(custom.joy1dat,0))|| BIT(custom.joy1dat,9)||(BIT(custom.joy1dat,9)^BIT(custom.joy1dat,8))|| ((ciaa.ciapra&128)==0)) { Signal (BlankerServerProcess,1L<ie_Class==IECLASS_TIMER) { if (TimeLeft) { TimeLeft--; if (TimeLeft==0L) Signal (BlankerServerProcess,1L<Max)) { set (ST_Object,MUIA_String_Integer,*Data); return FALSE; } else { *Data=NewData; return TRUE; } } ASM(LONG) ModeDispFunc(REG(a0) struct Hook *Hook, REG(a2) char **Array, REG(a1) struct ModeNode *ModeNode) { *Array=ModeNode->mn_Node.ln_Name; return 0L; } struct Hook HK_Mode = {NULL,NULL,(void *)ModeDispFunc,NULL,NULL}; void CloseConfigWindow(void) { if (WI_Config) { set (WI_Config,MUIA_Window_Open,FALSE); DoMethod (AP_ASwarm,OM_REMMEMBER,WI_Config); MUI_DisposeObject (WI_Config); WI_Config=NULL; } } /* New Makros for KeyLabels with Guide-Nodes */ REGARGS(APTR) NodeKeyLabelF(char *Label,char HiChar,char *Node) { return TextObject, MUIA_Text_PreParse,"\33r", MUIA_Text_Contents,Label, MUIA_Weight,0, MUIA_InnerLeft,0, MUIA_InnerRight,0, MUIA_Text_HiChar,HiChar, MUIA_HelpNode,Node, End; } REGARGS(APTR) NodeKeyLabel1F(char *Label,char HiChar,char *Node) { return TextObject, MUIA_Text_PreParse,"\33r", MUIA_Text_Contents,Label, MUIA_Weight,0, MUIA_InnerLeft,0, MUIA_InnerRight,0, MUIA_Text_HiChar,HiChar, ButtonFrame, MUIA_FramePhantomHoriz,TRUE, MUIA_HelpNode,Node, End; } REGARGS(APTR) NodeKeyLabel2F(char *Label,char HiChar,char *Node) { return TextObject, MUIA_Text_PreParse,"\33r", MUIA_Text_Contents,Label, MUIA_Weight,0, MUIA_InnerLeft,0, MUIA_InnerRight,0, MUIA_Text_HiChar,HiChar, StringFrame, MUIA_FramePhantomHoriz,TRUE, MUIA_HelpNode,Node, End; } REGARGS(APTR) NodeKeyButtonF(char *Name,char Key,char *Node) { return TextObject, ButtonFrame, MUIA_Text_Contents,Name, MUIA_Text_PreParse,"\33c", MUIA_Text_HiChar,Key, MUIA_ControlChar,Key, MUIA_InputMode,MUIV_InputMode_RelVerify, MUIA_Background,MUII_ButtonBack, MUIA_HelpNode,Node, End; } /* should be: REGARGS(APTR) ... but DICE 2.07.54 doesn't like that. */ APTR NodeKeySliderF(LONG Min,LONG Max,LONG Level,char Key,char *Node) { return SliderObject, MUIA_Slider_Min,Min, MUIA_Slider_Max,Max, MUIA_Slider_Level,Level, MUIA_ControlChar,Key, MUIA_HelpNode,Node, End; } REGARGS(APTR) NodeKeyCheckMarkF(LONG Selected,char Control,char *Node) { return ImageObject, ImageButtonFrame, MUIA_InputMode,MUIV_InputMode_Toggle, MUIA_Image_Spec,MUII_CheckMark, MUIA_Image_FreeVert,TRUE, MUIA_Selected,Selected, MUIA_Background,MUII_ButtonBack, MUIA_ShowSelState,FALSE, MUIA_ControlChar,Control, MUIA_HelpNode,Node, End; } void OpenConfigWindow(void) { ULONG Index; APTR BT_Hide,BT_Blank,BT_Quit; if (WI_Config) { DoMethod (WI_Config,MUIM_Window_ToFront); set (WI_Config,MUIA_Window_Open,TRUE); return; } if (SysBase->AttnFlags&AFF_68020) if (SysBase->AttnFlags&AFF_68030) if (SysBase->AttnFlags&AFF_68040) Index=3L; else Index=2L; else Index=1L; else Index=0L; (void)memcpy(&CE_Speed[0],&CE_SpeedPreDef[Index],4L*sizeof(char *)); CE_Speed[4]=NULL; if (!WBStarted) { NM_Config[1].nm_Flags|=NM_ITEMDISABLED; NM_Config[2].nm_Flags|=NM_ITEMDISABLED; } if (WI_Config=WindowObject, MUIA_Window_Title,"ASwarm II V2.0", MUIA_Window_ID,"CONFIG", MUIA_Window_Menu,NM_Config, MUIA_HelpNode, NODE_MAIN_MAIN, WindowContents,VGroup, Child,ColGroup(4),GroupFrameT("Commodity Options"), MUIA_HelpNode,NODE_COMM_MAIN, Child,NodeKeyLabel2F("Timeout",'t',NODE_COMM_TIMEOUT), Child,ST_Time=StringObject, StringFrame, MUIA_ControlChar,'t', MUIA_String_Integer,TimeOut, MUIA_String_Accept,"0123456789", MUIA_HorizWeight,25, MUIA_HelpNode,NODE_COMM_TIMEOUT, End, Child,NodeKeyLabel2F("Pop Key",'p',NODE_COMM_POPKEY), Child,ST_Pop=StringObject, StringFrame, MUIA_String_Contents,PopKey, MUIA_String_MaxLen,128L, MUIA_ControlChar,'p', MUIA_HelpNode,NODE_COMM_POPKEY, End, Child,NodeKeyLabel2F("Client Timeout",'l',NODE_COMM_CLTIME), Child,ST_Client=StringObject, StringFrame, MUIA_ControlChar,'l', MUIA_String_Integer,ClientTimeOut, MUIA_String_Accept,"0123456789", MUIA_HorizWeight,25, MUIA_HelpNode,NODE_COMM_CLTIME, End, Child,NodeKeyLabel2F("Blank Key",'k',NODE_COMM_BLANKKEY), Child,ST_Blank=StringObject, StringFrame, MUIA_String_Contents,BlankKey, MUIA_String_MaxLen,128L, MUIA_ControlChar,'k', MUIA_HelpNode,NODE_COMM_BLANKKEY, End, Child,NodeKeyLabel2F("Final Timeout",'f',NODE_COMM_FITIME), Child,ST_Final=StringObject, StringFrame, MUIA_ControlChar,'f', MUIA_String_Integer,FinalTimeOut, MUIA_String_Accept,"0123456789", MUIA_HorizWeight,25, MUIA_HelpNode,NODE_COMM_FITIME, End, Child,NodeKeyLabel1F("JoyStick",'j',NODE_COMM_JOYSTICK), Child,HGroup, Child,CM_JoyStick=NodeKeyCheckMarkF(JoyStick,'j',NODE_COMM_JOYSTICK), Child,RectangleObject,End, MUIA_HelpNode,NODE_COMM_JOYSTICK, End, End, Child,HGroup, Child,VGroup,GroupFrameT("Swarm Options"), MUIA_HelpNode, NODE_SWARM_MAIN, Child,ColGroup(2), Child,NodeKeyLabel1F("Speed",'s',NODE_SWARM_SPEED), Child,CY_Speed=CycleObject, MUIA_Cycle_Active,Speed-1L, MUIA_Cycle_Entries,CE_Speed, MUIA_ControlChar,'s', MUIA_HelpNode, NODE_SWARM_SPEED, End, Child,NodeKeyLabelF("Wasps",'w',NODE_SWARM_WASPS), Child,SL_Wasps=NodeKeySliderF(1L,MAX_WASPS,NumWasps,'w',NODE_SWARM_WASPS), Child,NodeKeyLabelF("Bees",'e',NODE_SWARM_BEES), Child,SL_Bees=NodeKeySliderF(1L,MAX_BEES,NumBees,'e',NODE_SWARM_BEES), Child,NodeKeyLabelF("Velocity",'v',NODE_SWARM_VELO), Child,SL_Velo=NodeKeySliderF(1L,MAX_VEL,Velocity,'v',NODE_SWARM_VELO), Child,NodeKeyLabelF("Tightness",'i',NODE_SWARM_TIGHT), Child,SL_Tight=NodeKeySliderF(1L,MAX_TIGHTNESS,Tightness,'i',NODE_SWARM_TIGHT), Child,NodeKeyLabel1F("Color Cycling",'c',NODE_SWARM_COLOR), Child,CM_Cycle=NodeKeyCheckMarkF(Cycle,'c',NODE_SWARM_COLOR), Child,NodeKeyLabel1F("Aim",'a',NODE_SWARM_AIM), Child,CM_Aim=NodeKeyCheckMarkF(AimMode,'a',NODE_SWARM_AIM), End, Child,RectangleObject,End, End, Child,VGroup,GroupFrameT("Display Options"),MUIA_HelpNode,NODE_DISPLAY_MAIN, Child,LV_Modes=ListviewObject, MUIA_Listview_List,ListObject, MUIA_List_DisplayHook,&HK_Mode, MUIA_List_AdjustWidth,TRUE, MUIA_HelpNode,NODE_DISPLAY_LIST, InputListFrame, End, End, Child,HGroup, Child,NodeKeyLabel1F("Mouse Blank",'m',NODE_DISPLAY_MOUSE), Child,CY_Mouse=CycleObject, MUIA_Cycle_Active,MouseBlank, MUIA_Cycle_Entries,CE_MouseBlank, MUIA_ControlChar,'m', MUIA_HelpNode, NODE_DISPLAY_MOUSE, End, End, End, End, Child,HGroup, Child,BT_Hide=NodeKeyButtonF("Hide",'h',NODE_MAIN_HIDE), Child,BT_Blank=NodeKeyButtonF("Blank",'b',NODE_MAIN_BLANK), Child,BT_Quit=NodeKeyButtonF("Quit",'q',NODE_MAIN_QUIT), End, End, End) /* Have you seen this? No f*cking macros for GadTools needed to calculate the size and position of gadgets */ { struct ModeNode *ModeNode; DoMethod (AP_ASwarm,OM_ADDMEMBER,WI_Config); DoMethod (WI_Config,MUIM_Notify,MUIA_Window_CloseRequest,TRUE, AP_ASwarm,2,MUIM_Application_ReturnID,ID_CLOSE_WINDOW); DoMethod (ST_Time,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_TIMEOUT); DoMethod (ST_Pop,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_POPKEY); DoMethod (ST_Client,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_CLIENTTIMEOUT); DoMethod (ST_Blank,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_BLANKKEY); DoMethod (ST_Final,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_FINALTIMEOUT); DoMethod (CM_JoyStick,MUIM_Notify,MUIA_Selected,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_JOYSTICK); DoMethod (CY_Speed,MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_SPEED); DoMethod (SL_Wasps,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_WASPS); DoMethod (SL_Bees,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_BEES); DoMethod (SL_Velo,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_VELOCITY); DoMethod (SL_Tight,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_TIGHTNESS); DoMethod (CM_Cycle,MUIM_Notify,MUIA_Selected,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_CYCLE); DoMethod (CM_Aim,MUIM_Notify,MUIA_Selected,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_AIM); DoMethod (LV_Modes,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_MODES); DoMethod (CY_Mouse,MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime, AP_ASwarm,2,MUIM_Application_ReturnID,ID_MOUSE); DoMethod (BT_Hide,MUIM_Notify,MUIA_Pressed,FALSE, AP_ASwarm,2,MUIM_Application_ReturnID,ID_CLOSE_WINDOW); DoMethod (BT_Blank,MUIM_Notify,MUIA_Pressed,FALSE, AP_ASwarm,2,MUIM_Application_ReturnID,ID_BLANK); DoMethod (BT_Quit,MUIM_Notify,MUIA_Pressed,FALSE, AP_ASwarm,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit); DoMethod (WI_Config,MUIM_Window_SetCycleChain, ST_Time,ST_Pop,ST_Client,ST_Blank,ST_Final,CM_JoyStick, CY_Speed,SL_Wasps,SL_Bees,SL_Velo,SL_Tight,CM_Cycle,CM_Aim, LV_Modes,CY_Mouse, BT_Hide,BT_Blank,BT_Quit,NULL); ModeNode=(struct ModeNode *)ModeList->lh_Head; while (ModeNode->mn_Node.ln_Succ) { DoMethod (LV_Modes,MUIM_List_Insert,&ModeNode,1L,MUIV_List_Insert_Bottom); ModeNode=(struct ModeNode *)ModeNode->mn_Node.ln_Succ; } set (WI_Config,MUIA_Window_Open,TRUE); set (LV_Modes,MUIA_List_Active,DisplayMode->mn_Index); } DoMethod (WI_Config,MUIM_Window_ScreenToFront); DoMethod (WI_Config,MUIM_Window_ToFront); set (WI_Config,MUIA_Window_Open,TRUE); } void About(void) { (void)MUI_Request(AP_ASwarm,WI_Config,0L, "About","*Ok", "\33cASwarm II V2.0 - The Original One\n" "(c) 1992-1994 by Markus Illenseer and Matthias Scheler\n" "\33cThis program is freely distributable.\n\n" "\33cThis is a MUI Application.",TAG_END); } /* Function to handle the Commodity Stuff */ ASM(void) CxDispatcher(REG(a0) struct Hook *Hook, REG(a2) APTR AP_Object, REG(a1) CxMsg *CxMsg) { ULONG MsgType,MsgID; MsgType=CxMsgType(CxMsg); MsgID=CxMsgID(CxMsg); switch (MsgType) { case CXM_IEVENT: if (MsgID==EVENT_BLANK) DoMethod (AP_Object,MUIM_Application_ReturnID,ID_BLANK); else DoMethod (AP_Object,MUIM_Application_ReturnID,ID_OPEN_WINDOW); break; case CXM_COMMAND: switch (MsgID) { case CXCMD_UNIQUE: DoMethod (AP_Object,MUIM_Application_ReturnID,ID_OPEN_WINDOW); } } } struct Hook HK_Broker = {NULL,NULL,(void *)CxDispatcher,NULL,NULL}; REGARGS(CxObj *) InstallHotKey(CxObj *Filter,char *Describ,LONG Event, char *Default) { if (Filter) { RemoveCxObj (Filter); DeleteCxObj (Filter); } if (Filter=HotKey(Describ,CxPort,Event)) if (CxObjError(Filter)==0L) { AttachCxObj (Broker,Filter); return Filter; } else DeleteCxObj (Filter); if (Filter=HotKey(Default,CxPort,Event)) if (CxObjError(Filter)==0L) { AttachCxObj (Broker,Filter); (void)strcpy(Describ,Default); return Filter; } else DeleteCxObj (Filter); (void)strcpy(Describ,""); return NULL; } /* Hooks for ARexx Port */ ASM(LONG) RxEnable(REG(a0) struct Hook *Hook, REG(a2) APTR AP_Object, REG(a1) LONG *Array) { (void)ActivateCxObj(Broker,TRUE); return 0L; } struct Hook HK_RxEnable = {NULL,NULL,(void *)RxEnable,NULL,NULL}; ASM(LONG) RxDisable(REG(a0) struct Hook *Hook, REG(a2) APTR AP_Object, REG(a1) LONG *Array) { (void)ActivateCxObj(Broker,FALSE); Signal (BlankerServerProcess,1L<mp_SigTask,SERVER_PRI+1L); Permit(); (void)WaitPort(BlankerClientMsg->bcm_Message.mn_ReplyPort); (void)GetMsg(BlankerClientMsg->bcm_Message.mn_ReplyPort); } REGARGS(struct MsgPort *) CreateBlankerClient(void *CodePtr, struct BlankerClientMsg *BlankerClientMsg) { struct Process *BlankerClientProcess; if (BlankerClientProcess=CreateNewProcTags(NP_Entry,CodePtr, NP_Name,"BlankerClient", NP_StackSize,4000L,TAG_DONE)) { PutMsg (&BlankerClientProcess->pr_MsgPort, (struct Message *)BlankerClientMsg); (void)WaitPort(BlankerClientMsg->bcm_Message.mn_ReplyPort); (void)GetMsg(BlankerClientMsg->bcm_Message.mn_ReplyPort); (void)SetTaskPri((struct Task *)BlankerClientProcess,CLIENT_PRI); if (BlankerClientMsg->bcm_Status) return &BlankerClientProcess->pr_MsgPort; } return NULL; } /* Open a Screen with the supplied DisplayID */ REGARGS(void) SpritesOff(struct Screen *BlankerScreen) { ULONG Index; if (!MouseBlank) { OFF_SPRITE /* switch sprites off */ for (Index=0L; Index<8L; Index++) custom.spr[Index].ctl=0; } else /* reactivate our window to show our null mouse pointer */ if (BlankerScreen->FirstWindow) ActivateWindow (BlankerScreen->FirstWindow); } REGARGS(struct Screen *) CreateScreen(struct List *ModeList,struct ModeNode *ModeNode) { struct Screen *Screen; if (Screen=OpenScreenTags(NULL, SA_Depth,2, SA_Title,"ASwarm II", SA_DisplayID,ModeNode->mn_DisplayID, SA_Quiet,TRUE,TAG_DONE)) { SetRGB4 (&Screen->ViewPort,0,0,0,0); SetRast (&Screen->RastPort,0); SpritesOff (Screen); } return Screen; } /* Functions for Creating/Drawing/Removing the Swarms */ void InitRandom(void) { ULONG Time[2]; CurrentTime (&Time[0],&Time[1]); RandN=(LONG)Time[0]; if (Time[1]<1000L) { RandF=4*Time[1]+1; RandI=2*Time[1]+1; } else { RandF=4*(Time[1]/1000L)+1; RandI=2*(Time[1]/1000L)+1; } } REGARGS(WORD) Random(WORD Max) { RandN=RandF*RandN+RandI; if (RandN<0L) RandN=-RandN; return (WORD)(RandN%Max); } BYTE SquareRootTab[256] = /* The mighty 256 Bytes eater :-) */ {0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5, 5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6, 6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11, 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, 12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13, 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, 13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14, 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, 14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}; REGARGS(LONG) FastSQRT(LONG x) /* *Grin* Nice idea, Tron */ { LONG sr; sr=1L; while (x>255L) { x/=4L; sr*=2L; } return sr*(LONG)SquareRootTab[x]; } REGARGS(ULONG) SwarmSize(LONG NumWaps,LONG NumBees) { return sizeof(struct SwarmStruct)+sizeof(WORD)*((ULONG)NumWaps*9L+ (ULONG)NumBees*9L); } /* should be: REGARGS(...) ... but DICE 2.07.54 doesn't like that. */ struct SwarmStruct *CreateSwarms(struct Screen *SwarmScreen, LONG NumWasps,LONG NumBees, LONG Speed,LONG Tightness) /* allocate Memory and initialize the Swarm(s) */ { LONG Index; struct SwarmStruct *SP; WORD *Ptr; if ((SP=AllocVec(SwarmSize(NumWasps,NumBees),0L))==NULL) return NULL; SP->ss_NumWasps=NumWasps; SP->ss_NumBees=NumBees; SP->ss_Width=SwarmScreen->Width; /* Will probably be changed in a */ SP->ss_Height=SwarmScreen->Height; /* future version of ASwarm */ SP->ss_BeeAcc=(Tightness*BEEACC)/MAX_SPEED+1; Ptr=(WORD *)&SP[1]; for (Index=0L; Index<4L; Index++) { SP->ss_WX[Index]=Ptr; Ptr+=NumWasps; SP->ss_WY[Index]=Ptr; Ptr+=NumWasps; SP->ss_X[Index]=Ptr; Ptr+=NumBees; SP->ss_Y[Index]=Ptr; Ptr+=NumBees; } SP->ss_NB=Ptr; SP->ss_MW=Ptr+NumWasps; /* Wasps */ for (Index=0L; Indexss_Width-2*BORDER); WaspY(1,Index)=WaspY(0,Index)=BORDER+Random(SP->ss_Height-2*BORDER); WaXVel(Index)=RAND(WASPACC); WaYVel(Index)=RAND(WASPACC); SP->ss_NB[Index]=0; } /* Bees */ for (Index=0L; Indexss_NumBees; Index++) { BeeX(1,Index)=BeeX(0,Index)=BORDER+Random(SP->ss_Width-2*BORDER); BeeY(1,Index)=BeeY(0,Index)=BORDER+Random(SP->ss_Height-2*BORDER); BXVel(Index)=RAND(SP->ss_BeeAcc); BYVel(Index)=RAND(SP->ss_BeeAcc); SP->ss_NB[MyWasp(Index)=Index%SP->ss_NumWasps]++; } return SP; } /* move Swarms and redraw it */ REGARGS(void) DrawSwarms(struct RastPort *RP,struct SwarmStruct *SP, LONG AimMode,LONG Velocity) { LONG Index; /* Wasps */ for (Index=0L; Indexss_NumWasps; Index++) { WaspX(2,Index)=WaspX(1,Index); WaspX(1,Index)=WaspX(0,Index); WaspY(2,Index)=WaspY(1,Index); WaspY(1,Index)=WaspY(0,Index); WaXVel(Index)+=RAND(WASPACC); WaYVel(Index)+=RAND(WASPACC); if (WaXVel(Index)>WASPVEL) WaXVel(Index)=WASPVEL; if (WaXVel(Index)<-WASPVEL) WaXVel(Index)=-WASPVEL; if (WaYVel(Index)>WASPVEL) WaYVel(Index)=WASPVEL; if (WaYVel(Index)<-WASPVEL) WaYVel(Index)=-WASPVEL; WaspX(0,Index)=WaspX(1,Index)+WaXVel(Index); WaspY(0,Index)=WaspY(1,Index)+WaYVel(Index); /* Bounce check for Wasps */ if ((WaspX(0,Index)SP->ss_Width-BORDER-1)) { WaXVel(Index)=-WaXVel(Index); /* if (WaspX(0,Index)ss_Width-BORDER-1; */ WaspX(0,Index)+=WaXVel(Index); } if ((WaspY(0,Index)SP->ss_Height-BORDER-1)) { WaYVel(Index)=-WaYVel(Index); /* if (WaspY(0,Index)ss_Height-BORDER-1; */ WaspY(0,Index)+=WaYVel(Index); } } /* Bees */ for (Index=0L; Indexss_NumBees; Index++) { WORD DX,DY,ChkIndex; LONG Distance,NewDistance; BeeX(2,Index)=BeeX(1,Index); BeeX(1,Index)=BeeX(0,Index); BeeY(2,Index)=BeeY(1,Index); BeeY(1,Index)=BeeY(0,Index); DX=WaspX(1,MyWasp(Index))-BeeX(1,Index); DY=WaspY(1,MyWasp(Index))-BeeY(1,Index); Distance=FastSQRT(DX*DX+DY*DY); if (Distance==0L) Distance=1L; if (AimMode) /* Look out for the nearest wasp if Aim-Mode is on */ for (ChkIndex=0; ChkIndex<=SP->ss_NumWasps; ChkIndex++) if (ChkIndex!=MyWasp(Index)) { LONG NewDX,NewDY; NewDX=WaspX(1,ChkIndex)-BeeX(1,Index); NewDY=WaspY(1,ChkIndex)-BeeY(1,Index); NewDistance=FastSQRT(NewDX*NewDX+NewDY*NewDY); if (Distance>NewDistance) { DX=NewDX; DY=NewDY; if (NewDistance==0L) Distance=1L; else Distance=NewDistance; SP->ss_NB[MyWasp(Index)]--; SP->ss_NB[MyWasp(Index)=ChkIndex]++; /* Mark a nearer Wasp */ } } BXVel(Index)+=(DX*SP->ss_BeeAcc)/Distance+RAND(3); BYVel(Index)+=(DY*SP->ss_BeeAcc)/Distance+RAND(3); if (BXVel(Index)>BEEVEL) BXVel(Index)=BEEVEL; if (BXVel(Index)<-BEEVEL) BXVel(Index)=-BEEVEL; if (BYVel(Index)>BEEVEL) BYVel(Index)=BEEVEL; if (BYVel(Index)<-BEEVEL) BYVel(Index)=-BEEVEL; BeeX(0,Index)=BeeX(1,Index)+BXVel(Index); BeeY(0,Index)=BeeY(1,Index)+BYVel(Index); /* Bounce check for Bees */ if ((BeeX(0,Index)(SP->ss_Width-BORDER-1))) { BXVel(Index)=-BXVel(Index); /* BeeX(0,Index)=BeeX(1,Index)+BXVel(Index); */ BeeX(0,Index)+=BXVel(Index); } if ((BeeY(0,Index)(SP->ss_Height-BORDER-1))) { BYVel(Index)=-BYVel(Index); /* BeeY(0,Index)=BeeY(1,Index)+BYVel(Index); */ BeeY(0,Index)+=BYVel(Index); } } /* Move our insects */ for (Index=0L; Indexss_NumWasps; Index++) /* Wasps */ { SetAPen (RP,0); Move (RP,WaspX(2,Index),WaspY(2,Index)); Draw (RP,WaspX(1,Index),WaspY(1,Index)); if(WaspX(0,Index)<0 || WaspX(0,Index)>SP->ss_Width || WaspY(0,Index)<0 || WaspY(0,Index)>SP->ss_Height) goto DoNotDraw; SetAPen (RP,WASP_PEN); Draw (RP,WaspX(0,Index),WaspY(0,Index)); DoNotDraw: ; } for (Index=0L; Indexss_NumBees; Index++) /* Bees */ { SetAPen (RP,0); Move (RP,BeeX(2,Index),BeeY(2,Index)); Draw (RP,BeeX(1,Index),BeeY(1,Index)); if(BeeX(0,Index)<0 || BeeX(0,Index)>SP->ss_Width || BeeY(0,Index)<0 || BeeY(0,Index)>SP->ss_Height) goto DoNotDraw2; SetAPen (RP,BEE_PEN); Draw (RP,BeeX(0,Index),BeeY(0,Index)); DoNotDraw2: ; } } /* This is the Client Process's Main Loop */ VOID_GETA4 ASwarmClientProcess(void) { struct BlankerClientMsg *BlankerClientMsg; struct MsgPort *BlankerClientPort; struct Task *BlankerServerTask; ULONG BlankerServerSigMask,Seconds,Micros,EndTime; struct Screen *SwarmScreen; LONG NumWasps,NumBees,Speed,Cycle,AimMode,Count,Tightness; struct SwarmStruct *Swarms; WORD Color,DColor; /* wait for Server's initial Message */ BlankerClientPort=FINDPROCPORT; (void)WaitPort(BlankerClientPort); BlankerClientMsg=(struct BlankerClientMsg *)GetMsg(BlankerClientPort); BlankerServerTask=BlankerClientMsg->bcm_Message.mn_ReplyPort->mp_SigTask; BlankerServerSigMask=BlankerClientMsg->bcm_SigMask; NumWasps=BlankerClientMsg->bcm_Wasps; NumBees=BlankerClientMsg->bcm_Bees; SwarmScreen=BlankerClientMsg->bcm_Screen; Speed=BlankerClientMsg->bcm_Speed; Cycle=BlankerClientMsg->bcm_Cycle; AimMode=BlankerClientMsg->bcm_AimMode; Tightness=BlankerClientMsg->bcm_Tightness; Velocity=BlankerClientMsg->bcm_Velocity; if (BlankerClientMsg->bcm_FinalTimeOut) { CurrentTime (&Seconds,&Micros); EndTime=Seconds+BlankerClientMsg->bcm_FinalTimeOut; } else EndTime=0L; /* init pseudo random number generator */ InitRandom(); /* initialize requested Number of Swarms */ if ((Swarms=CreateSwarms(SwarmScreen,NumWasps,NumBees,Speed,Tightness))==NULL) { BlankerClientMsg->bcm_Status=FALSE; Forbid(); ReplyMsg ((struct Message *)BlankerClientMsg); return; } BlankerClientMsg->bcm_Status=TRUE; ReplyMsg ((struct Message *)BlankerClientMsg); Color=BEE_COL_NUM-1; DColor=Cycle?1:0; Count=Speed; while ((BlankerClientMsg=(struct BlankerClientMsg *) GetMsg(BlankerClientPort))==NULL) { /* Color Cycling */ SwarmColors[BEE_PEN]=BeeColors[Color]; LoadRGB4 (&SwarmScreen->ViewPort,SwarmColors,4); Color+=DColor; if ((Color==-1)||(Color==BEE_COL_NUM)) { DColor=-DColor; Color+=2*DColor; } /* Synchronisation */ SpritesOff (SwarmScreen); WaitTOF(); if (CountRastPort,Swarms,AimMode,Velocity); if (IntuitionBase->FirstScreen!=SwarmScreen) { ScreenToFront (SwarmScreen); SpritesOff (SwarmScreen); } Signal (BlankerServerTask,BlankerServerSigMask); if (EndTime) { CurrentTime (&Seconds,&Micros); if (Seconds>=EndTime) /* final timeout reached, turn screen black */ { SetRGB4 (&SwarmScreen->ViewPort,BEE_PEN,0,0,0); SetRGB4 (&SwarmScreen->ViewPort,WASP_PEN,0,0,0); (void)WaitPort(BlankerClientPort); } } } FreeVec (Swarms); /* We are requested to finish, so we do. */ Forbid(); ReplyMsg ((struct Message *)BlankerClientMsg); } /* The Main Loop */ void main(LONG argc,UBYTE **argv) { CxObj *ObjectList; struct Screen *BlankerScreen=NULL; struct Window *BlankerWindow=NULL; struct MsgPort *BlankerClientPort=NULL; struct DiskObject *DiskObject; /* open our Libraries */ AddTool (GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L), CloseLibrary,0L); AddTool (IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library", 37L),CloseLibrary,0L); AddTool (CxBase=OpenLibrary("commodities.library",37L),CloseLibrary,0L); AddTool (IconBase=OpenLibrary(ICONNAME,37L),CloseLibrary,0L); AddTool (MUIMasterBase=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN),CloseLibrary,0L); /* create our MUI application object */ if (DiskObject=GetDiskObject("PROGDIR:ASwarm")) AddTool (DiskObject,FreeDiskObject,0L); AP_ASwarm=ApplicationObject, MUIA_Application_Title,"ASwarm II", MUIA_Application_Version,Version, MUIA_Application_Copyright, "Copyright © 1992-1994, Markus Illenseer & Matthias Scheler", MUIA_Application_Author,"Markus Illenseer & Matthias Scheler", MUIA_Application_Description,"Screen Blanker based on XSwarm", MUIA_Application_Base,"ASwarm", MUIA_Application_SingleTask,TRUE, MUIA_Application_DiskObject,DiskObject, MUIA_Application_BrokerHook,&HK_Broker, MUIA_Application_BrokerPri,CxPri, MUIA_Application_Commands,ASwarmRexxCommands, MUIA_HelpFile,GUIDE_FILE, End; if (AP_ASwarm==NULL) exit (10L); AddTool (AP_ASwarm,MUI_Dispose,0L); /* create List of Graphics Modes */ AddTool (ModeList=CreateModeList(),DeleteModeList,0L); /* get some Signals */ BlankerServerProcess=SysBase->ThisTask; if ((bsp_TimeOut=AllocSignal(-1L))==-1) exit (10); AddTool ((void *)bsp_TimeOut,FreeSignal,0L); if ((bsp_InputSig=AllocSignal(-1L))==-1) exit (10); AddTool ((void *)bsp_InputSig,FreeSignal,0L); if ((bsp_ClientSig=AllocSignal(-1L))==-1) exit (10); AddTool ((void *)bsp_ClientSig,FreeSignal,0L); /* Were we started from Workbench or from CLI ? */ if (WBStarted=(argc==0L)) { /* Workbench: load Config from DiskObject */ struct WBStartup *WBenchMsg; WBenchMsg=(struct WBStartup *)argv; LoadConfig (WBenchMsg->sm_NumArgs?WBenchMsg->sm_ArgList->wa_Name:NULL); } else { struct RDArgs *RDArgs; LONG Array[17]; (void)memset(Array,'\0',sizeof(Array)); if (RDArgs=ReadArgs(Template,Array,NULL)) { AddTool (RDArgs,FreeArgs,0L); CxPri=RDArgsLong(Array[0],0L,-128L,127L); (void)strcpy(PopKey,Array[1]?(char *)Array[1]:DEF_POPKEY); CxPopUp=Array[2]; (void)strcpy(BlankKey,Array[3]?(char *)Array[3]:DEF_BLANKKEY); /* get Time Out, Client Time Out and Display mode */ TimeOut=RDArgsLong(Array[4],DEF_TIMEOUT,1L,MAX_TIMEOUT); ClientTimeOut=RDArgsLong(Array[5],DEF_CLIENT_TIMEOUT,1L, MAX_CLIENT_TIMEOUT); if ((DisplayMode=FindMode(ModeList,Array[6]?(char *)Array[6]:""))==NULL) DisplayMode=GetDefaultMode(ModeList); /* get Parameters for Graphics */ Cycle=Array[7]; AimMode=Array[8]; JoyStick=Array[15]; NumWasps=RDArgsLong(Array[9],DEF_WASPS,1L,MAX_WASPS); NumBees=RDArgsLong(Array[10],DEF_BEES,1L,MAX_BEES); Speed=RDArgsLong(Array[11],DEF_SPEED,1L,MAX_SPEED); Tightness=RDArgsLong(Array[12],DEF_TIGHTNESS,1L,MAX_TIGHTNESS); if (stricmp(Array[13]?(char *)Array[13]:"",CE_MouseBlank[1])) MouseBlank=0L; else MouseBlank=1L; Velocity=RDArgsLong(Array[14],DEF_VEL,1L,MAX_VEL); FinalTimeOut=RDArgsLong(Array[16],DEF_FINAL_TIMEOUT,0L,MAX_FINAL_TIMEOUT); } else { PrintFault (IoErr(),"ASwarm"); exit (10); } } /* get our Broker from MUI */ Broker=NULL; get (AP_ASwarm,MUIA_Application_Broker,&Broker); if (Broker==NULL) exit (10); CxPort=NULL; get (AP_ASwarm,MUIA_Application_BrokerPort,&CxPort); if (CxPort==NULL) exit (10); /* install our Hot Keys */ PopKeyFilter=InstallHotKey(NULL,PopKey,EVENT_OPEN_WINDOW,DEF_POPKEY); BlankKeyFilter=InstallHotKey(NULL,BlankKey,EVENT_BLANK,DEF_BLANKKEY); /* install our "InputHandler" */ TimeLeft=InitTimeLeft=TimeOut*10L; ObjectList=CxCustom(BlankerAction,0L); AttachCxObj (Broker,ObjectList); if (CxObjError(ObjectList)) exit (10); (void)ActivateCxObj(Broker,TRUE); /* open Window on startup if not forbidden */ if (CxPopUp) OpenConfigWindow(); /* increase our Priority */ AddTool (BlankerServerProcess,SetTaskPri, (LONG)SetTaskPri(BlankerServerProcess,SERVER_PRI)); /* start the Loop */ FOREVER { ULONG Signal,Mask; /* handle MUI events */ do { char *Ptr; struct WBStartup *WBenchMsg; switch (DoMethod(AP_ASwarm,MUIM_Application_Input,&Signal)) { case MUIV_Application_ReturnID_Quit: exit (0); case ID_OPEN_WINDOW: OpenConfigWindow(); break; case ID_CLOSE_WINDOW: CloseConfigWindow(); break; case ID_BLANK: TimeLeft=InitTimeLeft=2L; break; case ID_TIMEOUT: if (GetNum(ST_Time,&TimeOut,1L,MAX_TIMEOUT)) TimeLeft=InitTimeLeft=10L*TimeOut; break; case ID_POPKEY: Ptr=NULL; get (ST_Pop,MUIA_String_Contents,&Ptr); if (Ptr) { (void)strcpy(PopKey,Ptr); PopKeyFilter=InstallHotKey(PopKeyFilter,PopKey, EVENT_OPEN_WINDOW,DEF_POPKEY); set (ST_Pop,MUIA_String_Contents,PopKey); } break; case ID_CLIENTTIMEOUT: (void)GetNum(ST_Client,&ClientTimeOut,1L,MAX_CLIENT_TIMEOUT); break; case ID_BLANKKEY: Ptr=NULL; get (ST_Blank,MUIA_String_Contents,&Ptr); if (Ptr) { (void)strcpy(BlankKey,Ptr); BlankKeyFilter=InstallHotKey(BlankKeyFilter,BlankKey, EVENT_BLANK,DEF_BLANKKEY); set (ST_Blank,MUIA_String_Contents,BlankKey); } break; case ID_FINALTIMEOUT: (void)GetNum(ST_Final,&FinalTimeOut,0L,MAX_FINAL_TIMEOUT); break; case ID_JOYSTICK: get (CM_JoyStick,MUIA_Selected,&JoyStick); break; case ID_SPEED: Speed--; get (CY_Speed,MUIA_Cycle_Active,&Speed); Speed++; break; case ID_MOUSE: get (CY_Mouse,MUIA_Cycle_Active,&MouseBlank); break; case ID_WASPS: get (SL_Wasps,MUIA_Slider_Level,&NumWasps); break; case ID_BEES: get (SL_Bees,MUIA_Slider_Level,&NumBees); break; case ID_VELOCITY: get (SL_Velo,MUIA_Slider_Level,&Velocity); break; case ID_TIGHTNESS: get (SL_Tight,MUIA_Slider_Level,&Tightness); break; case ID_CYCLE: get (CM_Cycle,MUIA_Selected,&Cycle); break; case ID_AIM: get (CM_Aim,MUIA_Selected,&AimMode); break; case ID_MODES: { struct ModeNode *NewMode; NewMode=NULL; DoMethod (LV_Modes,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&NewMode); if (NewMode) DisplayMode=NewMode; break; } case ID_LOAD_CONFIG: WBenchMsg=(struct WBStartup *)argv; LoadConfig (WBenchMsg->sm_NumArgs?WBenchMsg->sm_ArgList->wa_Name:NULL); PopKeyFilter=InstallHotKey(PopKeyFilter,PopKey,EVENT_OPEN_WINDOW, DEF_POPKEY); BlankKeyFilter=InstallHotKey(BlankKeyFilter,BlankKey,EVENT_BLANK, DEF_BLANKKEY); break; case ID_SAVE_CONFIG: WBenchMsg=(struct WBStartup *)argv; if (WBenchMsg->sm_NumArgs) SaveConfig(WBenchMsg->sm_ArgList->wa_Name); break; case ID_ABOUT: About(); break; case ID_DEFAULTS: LoadConfig (NULL); PopKeyFilter=InstallHotKey(PopKeyFilter,PopKey,EVENT_OPEN_WINDOW, DEF_POPKEY); BlankKeyFilter=InstallHotKey(BlankKeyFilter,BlankKey,EVENT_BLANK, DEF_BLANKKEY); } } while (Signal==0L); /* wait */ Mask=Wait(MASK(bsp_TimeOut)|MASK(bsp_InputSig)|MASK(bsp_ClientSig)|SIGBREAKF_CTRL_C|Signal); /* check for -C */ if (Mask&SIGBREAKF_CTRL_C) exit (0); /* Input detected, unblank if necessary */ if (Mask&MASK(bsp_InputSig)) { if (BlankerScreen) { if (BlankerClientPort) RemTool (BlankerClientPort); if (BlankerWindow) RemTool (BlankerWindow); RemTool (BlankerScreen); BlankerScreen=NULL; InitTimeLeft=TimeOut*10L; ON_SPRITE } TimeLeft=InitTimeLeft; } /* client has confirmed that it is still alive */ if (Mask&MASK(bsp_ClientSig)) TimeLeft=InitTimeLeft; /* time run out */ if (TimeLeft==0L) if (BlankerScreen) { /* Client Time Out reached, turn entire screen black */ SetRGB4 (&BlankerScreen->ViewPort,BEE_PEN,0,0,0); SetRGB4 (&BlankerScreen->ViewPort,WASP_PEN,0,0,0); /* check again after one second to keep screen in front */ TimeLeft=10L; if (IntuitionBase->FirstScreen!=BlankerScreen) ScreenToFront (BlankerScreen); SpritesOff (BlankerScreen); } else { AddTool (BlankerScreen=CreateScreen(ModeList,DisplayMode), CloseScreen,0L); if (MouseBlank) if (BlankerWindow=OpenWindowTags(NULL, WA_Width,1, WA_Height,1, WA_CustomScreen,BlankerScreen, WA_Flags,WFLG_ACTIVATE|WFLG_RMBTRAP| WFLG_BORDERLESS|WFLG_SIMPLE_REFRESH, TAG_DONE)) { AddTool (BlankerWindow,CloseWindow,0L); SetPointer (BlankerWindow,EmptyPointer,1L,1L,0L,0L); } else { MouseBlank=0L; if (WI_Config) set (CY_Mouse,MUIA_Cycle_Active,MouseBlank); } else BlankerWindow=NULL; BlankerClientMsg.bcm_Message.mn_Node.ln_Type=NT_MESSAGE; BlankerClientMsg.bcm_Message.mn_Node.ln_Pri=0; BlankerClientMsg.bcm_Message.mn_Length=sizeof(struct BlankerClientMsg); BlankerClientMsg.bcm_Message.mn_ReplyPort=FINDPROCPORT; BlankerClientMsg.bcm_Screen=BlankerScreen; BlankerClientMsg.bcm_SigMask=1L<