2
* Copyright (C) 2002-4 by the Widelands Development Team
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License
6
* as published by the Free Software Foundation; either version 2
7
* of the License, or (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
#include "editorinteractive.h"
23
#include "editor_game_base.h"
24
#include "filesystem.h"
28
#include "transport.h"
30
#include "widelands_map_data_packet_ids.h"
31
#include "widelands_map_roaddata_data_packet.h"
34
#define CURRENT_PACKET_VERSION 1
39
Widelands_Map_Roaddata_Data_Packet::~Widelands_Map_Roaddata_Data_Packet(void) {
45
void Widelands_Map_Roaddata_Data_Packet::Read(FileRead* fr, Editor_Game_Base* egbase, bool skip, Widelands_Map_Map_Object_Loader* ol) throw(wexception) {
47
// First packet version
48
int packet_version=fr->Unsigned16();
50
if(packet_version==CURRENT_PACKET_VERSION) {
51
// Now the rest data len
52
uint len = fr->Unsigned32();
54
// Skip the rest, flags are not our problem here
61
uint ser=fr->Unsigned32();
62
if(ser==0xffffffff) // end of roaddata
64
assert(ol->is_object_known(ser));
65
assert(ol->get_object_by_file_index(ser)->get_type()==Map_Object::ROAD);
67
Road* r=static_cast<Road*>(ol->get_object_by_file_index(ser));
69
assert(!ol->is_object_loaded(r));
71
Player* plr = egbase->get_safe_player(fr->Unsigned8());
75
r->m_type=fr->Unsigned32();
77
uint ser1=fr->Unsigned32();
78
assert(ol->is_object_known(ser));
79
assert(ol->is_object_known(ser1));
80
r->m_flags[0]=static_cast<Flag*>(ol->get_object_by_file_index(ser));
81
r->m_flags[1]=static_cast<Flag*>(ol->get_object_by_file_index(ser1));
82
r->m_flagidx[0]=fr->Unsigned32();
83
r->m_flagidx[1]=fr->Unsigned32();
85
r->m_cost[0]=fr->Unsigned32();
86
r->m_cost[1]=fr->Unsigned32();
87
int nsteps=fr->Unsigned16();
89
Path p(egbase->get_map(), r->m_flags[0]->get_position());
91
for(i=0; i<nsteps; i++)
92
p.append(fr->Unsigned8());
93
r->set_path(egbase, p);
95
// Now that all rudimentary data is set, init this road,
96
// than overwrite the initialization values
97
r->link_into_flags(egbase);
99
r->m_idle_index=fr->Unsigned32();
100
r->m_desire_carriers=fr->Unsigned32();
101
assert(!r->m_carrier.get(egbase));
102
uint carrierid=fr->Unsigned32();
104
assert(ol->is_object_known(carrierid));
105
r->m_carrier=ol->get_object_by_file_index(carrierid);
109
if(r->m_carrier_request) {
110
delete r->m_carrier_request;
111
r->m_carrier_request=0;
114
bool request_exists=fr->Unsigned8();
116
if(egbase->is_game()) {
117
r->m_carrier_request = new Request(r, 0,
118
&Road::request_carrier_callback, r, Request::WORKER);
119
r->m_carrier_request->Read(fr, egbase, ol);
122
r->m_carrier_request=0;
125
log("Loaded roaddata for Road: %p\n", r);
127
ol->mark_object_as_loaded(r);
132
throw wexception("Unknown version %i in Widelands_Map_Roaddata_Data_Packet!\n", packet_version);
139
void Widelands_Map_Roaddata_Data_Packet::Write(FileWrite* fw, Editor_Game_Base* egbase, Widelands_Map_Map_Object_Saver* os) throw(wexception) {
140
// first of all the magic bytes
141
fw->Unsigned16(PACKET_ROADDATA);
143
// now packet version
144
fw->Unsigned16(CURRENT_PACKET_VERSION);
146
// Here we will insert skip data (packet lenght)
147
// later, write a dummy for know
148
int filepos = fw->GetFilePos();
149
fw->Unsigned32(0x00000000);
150
fw->ResetByteCounter();
152
// We walk the map again for roads
153
Map* map=egbase->get_map();
154
for(ushort y=0; y<map->get_height(); y++) {
155
for(ushort x=0; x<map->get_width(); x++) {
156
Field* f=map->get_field(Coords(x,y));
157
BaseImmovable* imm=f->get_immovable();
160
if(imm->get_type()==Map_Object::ROAD) {
161
Road* r=static_cast<Road*>(imm);
162
assert(os->is_object_known(r));
163
if(os->is_object_saved(r))
165
uint ser=os->get_object_file_index(r);
167
// First, write serial
170
// First, write PlayerImmovable Stuff
171
// Theres only the owner
172
fw->Unsigned8(r->get_owner()->get_player_number());
175
fw->Unsigned32(r->m_type);
178
assert(os->is_object_known(r->m_flags[0]));
179
assert(os->is_object_known(r->m_flags[1]));
180
fw->Unsigned32(os->get_object_file_index(r->m_flags[0]));
181
fw->Unsigned32(os->get_object_file_index(r->m_flags[1]));
184
fw->Unsigned32(r->m_flagidx[0]);
185
fw->Unsigned32(r->m_flagidx[1]);
188
fw->Unsigned32(r->m_cost[0]);
189
fw->Unsigned32(r->m_cost[1]);
192
fw->Unsigned16(r->m_path.get_nsteps());
194
for(i=0; i<r->m_path.get_nsteps(); i++)
195
fw->Unsigned8(r->m_path.get_step(i));
198
fw->Unsigned32(r->m_idle_index);
201
fw->Unsigned32(r->m_desire_carriers);
204
if(r->m_carrier.get(egbase)) {
205
assert(os->is_object_known(r->m_carrier.get(egbase)));
206
fw->Unsigned32(os->get_object_file_index(r->m_carrier.get(egbase)));
212
if(r->m_carrier_request) {
214
r->m_carrier_request->Write(fw, egbase, os);
218
os->mark_object_as_saved(r);
223
fw->Unsigned32(0xFFFFFFFF); // End of roads
225
// Now, write the packet length
226
fw->Unsigned32(fw->GetByteCounter(), filepos);