Oops.
[AROS-Contrib.git] / Games / Doom / aros_net_local.c
blob14d4682e3bce6cac8cf6a80e8c7b094e8055204d
1 #include <exec/exec.h>
2 #include <proto/exec.h>
3 #include <clib/alib_protos.h>
5 #define DEBUG 0
6 #include <aros/debug.h>
8 #include "d_net.h"
9 #include "doomstat.h"
10 #include "m_argv.h"
11 #include "i_system.h"
13 #include "aros_netspecial.h"
14 #include "aros_net_local.h"
16 /****************************************************************************/
18 arosnetdriver_t local_netdriver =
20 "Local",
21 "-netlocal",
22 AROSNetLocal_InitNetwork,
23 AROSNetLocal_CleanupNetwork,
24 AROSNetLocal_NetCmd
27 /****************************************************************************/
29 static struct ComPort *comport;
30 static struct ComMsg sendmsg, *getmsg;
31 static struct ComMsg fastmsg[NUM_FASTMSG];
32 static struct MsgPort fastmsg_freeport;
33 static struct MsgPort *sendport[MAX_PLAYERS];
34 static WORD playerid_to_node[MAX_PLAYERS];
35 static WORD playerid;
37 /****************************************************************************/
39 boolean AROSNetLocal_InitNetwork(void)
41 int i,i2,i3;
42 int netgame=0;
44 i = M_CheckParm ("-netlocal");
46 netgame = 1;
48 // parse player number and host list
49 doomcom->consoleplayer = consoleplayer = playerid = myargv[i + 1][0] - '1';
51 doomcom->numnodes = 1; // this node for sure
53 i++;
54 while (++i < myargc && myargv[i][0] != '-')
56 doomcom->numnodes++;
59 doomcom->id = DOOMCOM_ID;
60 doomcom->numplayers = doomcom->numnodes;
62 Forbid();
63 if (!(comport = (struct ComPort *)FindSemaphore(COMNAME)))
65 comport = AllocVec(sizeof(struct ComPort), MEMF_PUBLIC | MEMF_CLEAR);
66 if (!comport)
68 Permit();
69 I_Error("AROS_Net_Local: Out of memory!");
72 InitSemaphore(&comport->sem);
73 comport->sem.ss_Link.ln_Name = COMNAME;
74 comport->sem.ss_Link.ln_Pri = -128;
76 comport->pool = CreatePool(MEMF_PUBLIC, sizeof(struct ComMsg) * 20,
77 sizeof(struct ComMsg) * 20);
78 if (!comport->pool)
80 Permit();
81 FreeVec(comport);comport=0;
83 I_Error("AROS_Net_Local: Out of memory!");
86 AddSemaphore(&comport->sem);
88 for(i = 0;i < MAX_PLAYERS; i++)
90 comport->playerport[i].msgport.mp_Node.ln_Type = NT_MSGPORT;
91 comport->playerport[i].msgport.mp_Flags = PA_IGNORE;
92 comport->playerport[i].msgport.mp_SigBit = 0;
93 comport->playerport[i].msgport.mp_SigTask = NULL;
95 NewList(&comport->playerport[i].msgport.mp_MsgList);
99 if (comport->playerport[playerid].inuse)
101 Permit();
102 I_Error("AROS_Net_Local: ComPort %ld already in use!\n", playerid + 1);
105 comport->playerport[playerid].inuse = TRUE;
106 comport->users++;
108 Permit();
110 sendmsg.playerid = playerid;
112 for(i = 0;i < doomcom->numplayers; i++)
114 playerid_to_node[i] = -1;
117 i2 = 1;i3 = 1;
118 for(i = 0;i < doomcom->numplayers; i++)
120 if (i != playerid)
122 D(bug("Player: %d playerid_to_node[%d] = %d\n",playerid,i,i2));
123 playerid_to_node[i] = i2++;
125 D(bug("Player: %d sendport[%d] = %d\n",playerid,i3,i));
126 sendport[i3++] = &comport->playerport[i].msgport;
131 fastmsg_freeport.mp_Node.ln_Type = NT_MSGPORT;
132 fastmsg_freeport.mp_Flags = PA_IGNORE;
133 NewList(&fastmsg_freeport.mp_MsgList);
135 for(i = 0;i < NUM_FASTMSG; i++)
137 fastmsg[i].msg.mn_Node.ln_Type = NT_MESSAGE;
138 fastmsg[i].msg.mn_ReplyPort = &fastmsg_freeport;
139 fastmsg[i].msg.mn_Length = sizeof(struct ComMsg);
141 PutMsg(&fastmsg_freeport, &fastmsg[i].msg);
144 return true;
147 /****************************************************************************/
149 void AROSNetLocal_NetCmd (void)
151 if (doomcom->command == CMD_SEND) {
152 AROSNetLocal_NetSend ();
153 } else if (doomcom->command == CMD_GET) {
154 AROSNetLocal_NetGet ();
155 } else
156 I_Error ("AROS_Net_Local: Bad net cmd: %i\n",doomcom->command);
159 /****************************************************************************/
161 void AROSNetLocal_NetSend(void)
163 /* static int counter = 0; */
165 struct ComMsg *msg = (struct ComMsg *)GetMsg(&fastmsg_freeport);
166 /* no msg free ==> let's allocate one */
168 if (!msg) return;
170 /* {
171 Forbid();
172 msg = AllocPooled(comport->pool,sizeof(struct ComMsg));
173 Permit();
175 if (!msg) I_Error("AROS_Net_Local: Could not alloc ComMsg!");
176 msg->flags = CMF_ALLOCED;
177 msg->pool = comport->pool;
181 D(bug("Player %d (%06d): send to %d\n",playerid,counter++,doomcom->remotenode));
183 msg->dd = *netbuffer;
185 msg->datalen = doomcom->datalength;
186 msg->playerid = playerid;
188 PutMsg(sendport[doomcom->remotenode], &msg->msg);
191 /****************************************************************************/
193 void AROSNetLocal_NetGet(void)
196 getmsg = (struct ComMsg *)GetMsg(&comport->playerport[playerid].msgport);
198 if (!getmsg)
200 doomcom->remotenode = -1; // no packet
201 return;
204 D(bug("player %d: -------- netget %d (node = %d)\n",
205 playerid,
206 getmsg->playerid,
207 playerid_to_node[getmsg->playerid]));
209 doomcom->remotenode = playerid_to_node[getmsg->playerid];
210 doomcom->datalength = getmsg->datalen;
212 if (doomcom->remotenode < 0 || doomcom->remotenode >= MAX_PLAYERS)
214 doomcom->remotenode = - 1;
215 } else {
216 *netbuffer = getmsg->dd;
219 if (getmsg->flags & CMF_ALLOCED)
221 Forbid();
222 FreePooled(getmsg->pool, getmsg, sizeof(struct ComMsg));
223 Permit();
225 else if (!(getmsg->flags & CMF_DEAD))
227 ReplyMsg(&getmsg->msg);
232 /****************************************************************************/
234 void AROSNetLocal_CleanupNetwork(void)
236 WORD i;
238 Forbid();
240 comport->playerport[playerid].inuse = FALSE;
241 comport->users--;
243 /* Make sure sent fastmsg's are not replied back */
245 for(i = 0;i < NUM_FASTMSG; i++)
247 fastmsg[i].flags |= CMF_DEAD;
250 if (comport->users == 0)
252 RemSemaphore(&comport->sem);
255 Permit();
258 /****************************************************************************/